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

代码如下


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()=4

t2 : Inner.m4t2()=4

t1 : Inner.m4t1()=3

t2 : Inner.m4t2()=3

t1 : Inner.m4t1()=2

t2 : Inner.m4t2()=2

t1 : Inner.m4t1()=1

t2 : Inner.m4t2()=1

t1 : Inner.m4t1()=0

t2 : Inner.m4t2()=0

对于在m4t1中的对象锁,我不是很理解, 传入m4t1(),m4t2()的是同一个inner对象,m4t1已经将对象inner锁住, 为什么t2还可以访问m4t2呢? 希望可以有大神详细解释一下, 谢谢


呼啦一阵风
浏览 463回答 4
4回答

LEATH

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

狐的传说

你把m4t2方法改成这样private void  m4t2(Inner inner) {    synchronized(inner) {        inner.m4t2();    }}这个inner锁才起效果。因为你现在的m4t2方法是不需要拿锁就可以执行的,锁起的作用是保证对需要拿锁才能执行的代码在多线程执行的时候能保证顺序,对于不需要拿锁就可以执行的代码是不受限制的。

不负相思意

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

30秒到达战场

锁对象和对象实例在堆中不是在一起的,锁对象在“对象头”中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java