代码如下
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
呢? 希望可以有大神详细解释一下, 谢谢
因為synchronized鎖的是inner對象,m4t2沒去synchronized(inner)所以也不會去試圖遵守鎖的規則
你把
m4t2
方法改成這樣這個inner鎖才起效果。
因為你現在的
m4t2
方法是不需要拿鎖就可以執行的,鎖起的作用是保證對需要拿鎖才能執行的程式碼在多執行緒執行的時候能保證順序,對於不需要拿鎖就可以執行的代碼是不受限制的。這裡跟inner 沒有關係 因為 t2訪問Thread3的m4t2方法不是一個 synchronized 方法 所以不需要獲得inner對象的鎖,所以不會進入鎖隊列 所以很自由 是一個單獨的個體
鎖物件和物件實例在堆中不是在一起的,鎖物件在「物件頭」中。