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

网友投稿 250 2022-10-26


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

一、使用在非静态方法上

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.printStachttp://kTrace();

}

}

}

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相同:锁定的是当前类的这一段代码,只要多个线程共同执行这一段代码就会产生互斥


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:一些漂亮的界面设计。
下一篇:编译器特性ARC
相关文章

 发表评论

暂时没有评论,来抢沙发吧~