synchronized可以锁对象,代码块,类对象 ,那么他们用起来会有区别吗,这里我们用实际代码来探究下
1 | java复制代码package com.example.hxk.thread.synchroized; |
运行结果:
1 | java复制代码thread1 : 0 |
这里thread2会等thread1运行完成才会开始运行,说明thread1和thread2请求的是同一把锁,也就说明了 synchronized代码块锁当前对象和锁实例方法,他们的效果是一样的, 锁的都是当前对象。
然后我们再来看看类锁,修改代码如下
1 | java复制代码package com.example.hxk.thread.synchroized; |
运行结果:
1 | java复制代码thread1 : 0 |
这里可以看到thread2也是被thread1阻塞,所以他们持有的是同一把锁,也就说明synchronized修饰静态方法和锁类对象,他们的效果是一样的。
接下来我们同时用类锁和对象锁试试,代码如下
1 | java复制代码package com.example.hxk.thread.synchroized; |
运行结果:
1 | java复制代码thread1 : 0 |
运行结果是交替进行的,说明对象锁和类锁锁的不是同一个锁,他们是两个锁,互不影响
总结:
1,synchronized修饰在实例方法上和synchronized(this){} 同步代码块效果是一样的
2,synchronized修饰在静态方法上和 synchronized (SyncTest1.class) {} 同步代码块效果是一样的
3,synchronized修饰在实例方法表示锁的是当前对象,修饰静态方法表示锁的是类对象(一个类在jvm中只有一个class对象)
本文转载自: 掘金