代码如下
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
呢? 希望可以有大神详细解释一下, 谢谢
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
Changez la méthode
m4t2
par celle-ciCe 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".