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

这段代码中内部类inner的对象锁起到的作用?

这段代码中内部类inner的对象锁起到的作用?

呼啦一阵风 2019-03-13 18:13:16
代码如下package synchron;public class Thread3 {     class  Inner {          private void m4t1() {               int i = 5;               while(i-- > 0) {                    System.out.println(Thread.currentThread().getName() + " : Inner.m4t1()=" + i);                    try {                         Thread.sleep(500);                    } catch(InterruptedException ie) {                    }               }          }          private void m4t2() {               int i = 5;               while(i-- > 0) {                    System.out.println(Thread.currentThread().getName() + " : Inner.m4t2()=" + i);                    try {                         Thread.sleep(500);                    } catch(InterruptedException ie) {                    }               }          }     }        private void m4t1(Inner inner) {          synchronized(inner) { //使用对象锁          inner.m4t1();         }    }     private void  m4t2(Inner inner) {          inner.m4t2();     }     public static void main(String[] args) {          final Thread3 myt3 = new Thread3();          final Inner inner = myt3.new Inner();          Thread t1 = new Thread( new Runnable() {public void run() { myt3.m4t1(inner);} }, "t1");          Thread t2 = new Thread( new Runnable() {public void run() { myt3.m4t2(inner);} }, "t2");          t1.start();          t2.start();  } }输出如下t1 : Inner.m4t1()=4t2 : Inner.m4t2()=4t1 : Inner.m4t1()=3t2 : Inner.m4t2()=3t1 : Inner.m4t1()=2t2 : Inner.m4t2()=2t1 : Inner.m4t1()=1t2 : Inner.m4t2()=1t1 : Inner.m4t1()=0t2 : Inner.m4t2()=0对于在m4t1中的对象锁,我不是很理解, 传入m4t1(),m4t2()的是同一个inner对象,m4t1已经将对象inner锁住, 为什么t2还可以访问m4t2呢? 希望可以有大神详细解释一下, 谢谢
查看完整描述

4 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

因为synchronized锁的是inner对象,m4t2没去synchronized(inner)所以也不会去试图遵守锁的规则


查看完整回答
反对 回复 2019-04-18
?
狐的传说

TA贡献1804条经验 获得超3个赞

你把m4t2方法改成这样


private void  m4t2(Inner inner) {

    synchronized(inner) {

        inner.m4t2();

    }

}

这个inner锁才起效果。


因为你现在的m4t2方法是不需要拿锁就可以执行的,锁起的作用是保证对需要拿锁才能执行的代码在多线程执行的时候能保证顺序,对于不需要拿锁就可以执行的代码是不受限制的。


查看完整回答
反对 回复 2019-04-18
?
不负相思意

TA贡献1777条经验 获得超10个赞

这里跟inner 没有关系 因为 t2访问Thread3的m4t2方法不是一个 synchronized 方法 所以不需要获得inner对象的锁,所以不会进入锁队列 所以很自由 是一个单独的个体


查看完整回答
反对 回复 2019-04-18
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

锁对象和对象实例在堆中不是在一起的,锁对象在“对象头”中。


查看完整回答
反对 回复 2019-04-18
  • 4 回答
  • 0 关注
  • 462 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信