为了账号安全,请及时绑定邮箱和手机立即绑定

synchronized修饰代码块括号后面锁失效?

synchronized修饰代码块括号后面锁失效?

德玛西亚99 2019-03-20 18:15:36
package basic;public class TestSynchronizedObject {    public static void main(String[] args) {        final MyObject myObject_first = new MyObject();        final MyObject myObject_seconde = new MyObject();        new Thread("线程A") {            @Override            public void run() {                myObject_first.print("线程A");            }        }.start();        new Thread("线程B") {            @Override            public void run() {                myObject_seconde.print("线程B");            }        }.start();    }}class MyObject {        public void print(String str) {        System.out.println("线程" + Thread.currentThread().getName() + "开始执行");        输出结果:线程线程A开始执行线程A .0. 线程线程B开始执行线程A .1. 线程A .2. 线程A .3. 线程A .4. 线程A .5. 线程A .6. 线程A .7. 线程A .8. 线程A .9. 线程线程A执行结束线程B .0. 线程B .1. 线程B .2. 线程B .3. 线程B .4. 线程B .5. 线程B .6. 线程B .7. 线程B .8. 线程B .9. 线程线程B执行结束很显然,两个对象互斥执行了。可视我锁住的是String的所有实例化对象,而我开的线程用的是MyObject对象,我既然没有锁住MyObject对象,它为什么互斥执行呢?package basic;public class TestSynchronizedObject {    public static void main(String[] args) {        final MyObject myObject_first = new MyObject();        final MyObject myObject_seconde = new MyObject();        new Thread("线程A") {            @Override            public void run() {                myObject_first.print("线程A");            }        }.start();        new Thread("线程B") {            @Override            public void run() {                myObject_seconde.print("线程B");            }        }.start();    }}class MyObject {    public void print(String str) {        System.out.println("线程" + Thread.currentThread().getName() + "开始执行");如果这样,它的输出结果为:线程线程A开始执行线程A .0. 线程线程B开始执行线程A .1. 线程A .2. 线程A .3. 线程A .4. 线程A .5. 线程A .6. 线程A .7. 线程A .8. 线程A .9. 线程B .0. 线程线程A执行结束线程B .1. 线程B .2. 线程B .3. 线程B .4. 线程B .5. 线程B .6. 线程B .7. 线程B .8. 线程B .9. 线程线程B执行结束关于synchronized修饰代码块时,括号后面要跟什么,有没有这方面的博客详细解答一下哈,谢谢~~
查看完整描述

2 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

查看完整回答
反对 回复 2019-04-22
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

这篇博客 有解答。不过关于全局锁的提法容易令人误解。因为 sychoronized 是使用括号里的对象来上锁,而 String.class 不是String 类的全部实例,而是一个对象,是一个类型为 Class 的对象,因此,如果你使用不同的这样的 class 对象来同步,则获得的是不同的锁。


查看完整回答
反对 回复 2019-04-22
  • 2 回答
  • 0 关注
  • 603 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号