代码如下
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 は内部オブジェクトをロックするため、m4t2 は synchronize(inner) を行わず、ロック ルールに準拠しようとしません
リーリーm4t2
メソッドをこれに変更しますこのインナーロックが効果的です。
現在の
m4t2
メソッドはロックを取得せずに実行できるため、ロックの機能は、マルチスレッド実行中にロックの実行を必要とするコードの順序を保証することです。ロックは必要ありません。実行できるコードに制限はありません。Thread3 にアクセスする t2 の m4t2 メソッドは同期メソッドではないため、これはインナーとは関係ありません。したがって、インナーオブジェクトのロックを取得する必要がないため、ロックキューには入りません。とても自由で、独立した個人です
ロック オブジェクトとオブジェクト インスタンスはヒープ内に一緒に存在せず、ロック オブジェクトは「オブジェクト ヘッダー」内にあります。