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

发布于 2022-09-02 15:52:32 字数 1848 浏览 14 评论 0

代码如下

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呢? 希望可以有大神详细解释一下, 谢谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

荒路情人 2022-09-09 15:52:32

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

寒冷纷飞旳雪 2022-09-09 15:52:32

你把m4t2方法改成这样

private void  m4t2(Inner inner) {
    synchronized(inner) {
        inner.m4t2();
    }
}

这个inner锁才起效果。

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

∝单色的世界 2022-09-09 15:52:32

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

辞慾 2022-09-09 15:52:32

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文