synchronizedの役割(四)
1939 ワード
注意:
1、synchronizedでオブジェクトをロックする場合、そのオブジェクトがロックコードセグメントで変更されると、このロックは消えます.次の例を参照してください.
ターゲットクラス:
reloadメソッドでは、lockオブジェクト、すなわち注釈lock=「abc」は変更されません.その結果、reload endがコンソールから出力されてから100が出力されます.説明は同期呼び出しです.
reloadメソッドでlockオブジェクトを変更するとコメントが削除され、最初に数値(現在のveのサイズ)が出力され、reload endが出力されます.説明は非同期呼び出しです.
2、単例モードにおけるマルチスレッドの考慮
1、synchronizedでオブジェクトをロックする場合、そのオブジェクトがロックコードセグメントで変更されると、このロックは消えます.次の例を参照してください.
ターゲットクラス:
public class TestThread {
private static final class TestThreadHolder {
private static TestThread theSingleton = new TestThread();
public static TestThread getSingleton() {
return theSingleton;
}
private TestThreadHolder() {
}
}
private Vector ve =null;
private Object lock=new Object();
private TestThread(){
ve=new Vector();
initialize();
}
public static TestThread getInstance(){
return TestThreadHolder.getSingleton();
}
private void initialize(){
for(int i=0;i<100;i++){
ve.add(String.valueOf(i));
}
}
public void reload(){
synchronized(lock){
ve=null;
ve=new Vector();
//lock="abc";
for(int i=0;i<100;i++){
ve.add(String.valueOf(i));
}
}
System.out.println("reload end");
}
public boolean checkValid(String str){
synchronized(lock){
System.out.println(ve.size());
return ve.contains(str);
}
}
}
説明:reloadメソッドとcheckValidメソッドの両方にsynchronizedキーワードを追加し、lockオブジェクトをロックします.同じオブジェクトインスタンスのreloadメソッドとcheckValidメソッドは、異なるスレッドでそれぞれ呼び出されます.reloadメソッドでは、lockオブジェクト、すなわち注釈lock=「abc」は変更されません.その結果、reload endがコンソールから出力されてから100が出力されます.説明は同期呼び出しです.
reloadメソッドでlockオブジェクトを変更するとコメントが削除され、最初に数値(現在のveのサイズ)が出力され、reload endが出力されます.説明は非同期呼び出しです.
2、単例モードにおけるマルチスレッドの考慮