纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

Java synchronized关键字 Java多线程之synchronized关键字的使用

Fe_lin   2021-04-29 我要评论
想了解Java多线程之synchronized关键字的使用的相关内容吗,Fe_lin在本文为您仔细讲解Java synchronized关键字的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Java,synchronized关键字,java关键字,下面大家一起来学习吧。

一、使用在非静态方法上

public synchronized void syzDemo(){
   System.out.println(System.currentTimeMillis());
    System.out.println("进入synchronized锁:syzDemo");
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

二、使用在静态方法上

public synchronized static void syzDemo1(){
    System.out.println(System.currentTimeMillis());
    System.out.println("进入synchronized锁:syzDemo1");
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

三、使用在代码块上

public synchronized  void syzDemo2(){
    synchronized (this){
        System.out.println(System.currentTimeMillis());
        System.out.println("进入synchronized锁:syzDemo2");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public synchronized  void syzDemo3(){
   synchronized (ExcelUtil.class){
       System.out.println(System.currentTimeMillis());
       System.out.println("进入synchronized锁:syzDemo3");
       try {
           Thread.sleep(1000);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
   }
}

四、三种方式的区别

public static void main(String[] args) {
        SyzDemo syzDemo = new SyzDemo();
        SyzDemo syzDemo1 = new SyzDemo();
        Thread thread = new Thread(()->{
            syzDemo.syzDemo();
        });
        thread.start();
        Thread thread1 = new Thread(()->{
            syzDemo1.syzDemo();
        });
        thread1.start();
    }

4.1 不会互斥

public static void main(String[] args) {
        SyzDemo syzDemo = new SyzDemo();
        SyzDemo syzDemo1 = new SyzDemo();
        Thread thread = new Thread(()->{
            syzDemo.syzDemo();
        });
        thread.start();
        Thread thread1 = new Thread(()->{
            syzDemo.syzDemo();
        });
        thread1.start();
    }

4.2 互斥

public static void main(String[] args) {
        SyzDemo syzDemo = new SyzDemo();
        SyzDemo syzDemo1 = new SyzDemo();
        Thread thread = new Thread(()->{
            syzDemo.syzDemo1();
        });
        thread.start();
        Thread thread1 = new Thread(()->{
            syzDemo1.syzDemo1();
        });
        thread1.start();
    }

解析:

在图1中thread1和thread分别调用syzDemo和syzDemo1对象中的syzDemo方法,因为两个线程调用是不同的对象的两个方法,所以不会互斥

在图2中thread1和thread都在调用syzDemo对象中的syzDemo方法,因为syzDemo方法加了synchronized

在图3中thread1和thread分别调用syzDemo和syzDemo1对象中的syzDemo1方法,但是因为syzDemo1方法属于静态方法,在类加载时就会加载到方法区,所以本质上两个线程都在调用同一个方法,于是产生了互斥

syzDemo2中与syzDemo相同:锁定的是当前实例的这一段代码,只有多个线程中调用的是同一个实例且执行到这一段代码时才会互斥,syzDemo3于syzDemo1相同:锁定的是当前类的这一段代码,只要多个线程共同执行这一段代码就会产生互斥


相关文章

猜您喜欢

  • js随机码的生成与校验 JavaScript实现随机码的生成与校验

    想了解JavaScript实现随机码的生成与校验的相关内容吗,知识进脑的肖老千啊在本文为您仔细讲解js随机码的生成与校验的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:js随机码生成,js随机码校验,js随机码,下面大家一起来学习吧。..
  • MySQL数据迁移 MySQL数据迁移相关总结

    想了解MySQL数据迁移相关总结的相关内容吗,MySQL技术在本文为您仔细讲解MySQL数据迁移的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:MySQL,迁移,MySQL,数据迁移,下面大家一起来学习吧。..

网友评论

Copyright 2020 www.iunios.com 【OS下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式