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

代码如下

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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

répondre à tous(4)
大家讲道理

Parce que synchronisé verrouille l'objet interne, m4t2 ne se synchronise pas (intérieur), donc il n'essaiera pas de se conformer aux règles de verrouillage

Ty80

Changez la méthode m4t2 par celle-ci

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

Ce verrou intérieur est efficace.

Parce que votre méthode m4t2 actuelle peut être exécutée sans prendre de verrou. La fonction du verrou est de garantir que le code qui nécessite l'exécution d'un verrou peut garantir l'ordre lors de l'exécution multi-thread. ne nécessite pas de verrou, il n'y a aucune restriction sur le code qui peut être exécuté.

黄舟

Cela n'a rien à voir avec inner car la méthode m4t2 de t2 accédant à Thread3 n'est pas une méthode synchronisée, elle n'a donc pas besoin d'obtenir le verrou de l'objet interne, elle n'entrera donc pas dans la file d'attente de verrouillage, donc c'est très libre et est une personne distincte

黄舟

L'objet verrou et l'instance d'objet ne sont pas ensemble dans le tas, l'objet verrou est dans "l'en-tête de l'objet".

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal