首页 > 其他 > 详细

synchronized对普通同步方法和对静态方法的区别

时间:2019-09-09 16:26:03      阅读:103      评论:0      收藏:0      [点我收藏+]
synchronized是一个重量级锁,我们都知道该关键字锁住的是对象而不是代码本身,那么对于静态方法和同步方法有什么不同呢,通过如下代码进行测试
技术分享图片
 1 public class SynchronizedTest {
 2  
 3     private static int num;
 4  
 5     private synchronized void test(String param){
 6         if(StringUtils.equals(param,"a")){
 7             num = 100;
 8             System.out.println("set " + param + " num over");
 9             try {
10                 Thread.sleep(1000);
11             } catch (InterruptedException e) {
12                 e.printStackTrace();
13             }
14         }else{
15             num = 200;
16             System.out.println("set " + param + " num over");
17         }
18         System.out.println("i am : " + param + "; num = " + num);
19     }
20  
21     public static void main(String[] args){
22         SynchronizedTest s1 = new SynchronizedTest();
23         SynchronizedTest s2 = new SynchronizedTest();
24  
25         new Thread(new Runnable() {
26             @Override
27             public void run() {
28                 s1.test("a");
29             }
30         }).start();
31  
32         new Thread(new Runnable() {
33             @Override
34             public void run() {
35                 s2.test("b");
36             }
37         }).start();
38     }
39 }
View Code
技术分享图片
 
set a num over
set b num over
i am : b; num = 200
i am : a; num = 200
 
Process finished with exit code 0
View Code

我们可以看出两个不同的对象s1和s2并没有互斥,因为这里synchronized是分别持有两个对象的锁。如果要想m1,m2两个对象竞争同一个锁,则需要在method01()上加上static修饰,如下:

技术分享图片
 1 public class SynchronizedTest {
 2  
 3     private static int num;
 4  
 5     private synchronized static void test(String param){
 6         if(StringUtils.equals(param,"a")){
 7             num = 100;
 8             System.out.println("set " + param + " num over");
 9             try {
10                 Thread.sleep(1000);
11             } catch (InterruptedException e) {
12                 e.printStackTrace();
13             }
14         }else{
15             num = 200;
16             System.out.println("set " + param + " num over");
17         }
18         System.out.println("i am : " + param + "; num = " + num);
19     }
20  
21     public static void main(String[] args){
22         SynchronizedTest s1 = new SynchronizedTest();
23         SynchronizedTest s2 = new SynchronizedTest();
24  
25         new Thread(new Runnable() {
26             @Override
27             public void run() {
28                 s1.test("a");
29             }
30         }).start();
31  
32         new Thread(new Runnable() {
33             @Override
34             public void run() {
35                 s2.test("b");
36             }
37         }).start();
38     }
39 }
View Code

运行结果:

技术分享图片
set a num over
i am : a; num = 100
set b num over
i am : b; num = 200
 
Process finished with exit code 0
View Code

synchronized修饰不加static的方法,锁是加在单个对象上,不同的对象没有竞争关系;修饰加了static的方法,锁是加载类上,这个类所有的对象竞争一把锁.


版权声明:本文为CSDN博主「珍惜每一个遇见」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/LQM1991/article/details/86143278

synchronized对普通同步方法和对静态方法的区别

原文:https://www.cnblogs.com/hongdalin/p/11492192.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!