代码如下
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
呢? 希望可以有大神详细解释一下, 谢谢
Oleh kerana disegerakkan mengunci objek dalam, m4t2 tidak menyegerak(dalam), jadi ia tidak akan cuba mematuhi peraturan kunci
Tukar kaedah
m4t2
kepada iniKunci 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".