java - 这段代码中内部类inner的对象锁起到的作用?
高洛峰
高洛峰 2017-04-17 17:56:08
0
4
361

代码如下

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

membalas semua(4)
大家讲道理

Oleh kerana disegerakkan mengunci objek dalam, m4t2 tidak menyegerak(dalam), jadi ia tidak akan cuba mematuhi peraturan kunci

Ty80

Tukar kaedah m4t2 kepada ini

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

Kunci dalaman ini berkesan.

Kerana kaedah m4t2 semasa anda boleh dilaksanakan tanpa mengambil kunci Fungsi kunci adalah untuk memastikan kod yang memerlukan kunci untuk dilaksanakan dapat memastikan susunan semasa pelaksanaan berbilang benang tidak memerlukan kunci, Tiada sekatan pada kod yang boleh dilaksanakan.

黄舟

Ini tiada kaitan dengan inner kerana kaedah m4t2 t2 mengakses Thread3 bukanlah kaedah yang disegerakkan, jadi ia tidak perlu mendapatkan kunci objek dalam, jadi ia tidak akan memasuki baris gilir kunci, jadi ia adalah sangat bebas dan merupakan individu yang berasingan

黄舟

Objek kunci dan contoh objek tidak bersama dalam timbunan, objek kunci berada dalam "pengepala objek".

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan