1.8.3 suspendとresumeメソッドの欠点-非同期

1428 ワード

suspendとresumeメソッドを使用する場合も、スレッドの一時停止によりデータが同期しない場合があります.
/**
 * @author wuyoushan
 * @date 2017/3/29.
 */
public class MyObject {
    private String userName="1";
    private String password="11";

    public void setValue(String u,String p){
        this.userName=u;
        if(Thread.currentThread().getName().equals("a")){
            System.out.println("  a  !");
            Thread.currentThread().suspend();
        }
        this.password=p;
    }

    public void printUserNamePassword(){
        System.out.println(userName+" "+password);
    }
}

/**
 * @author wuyoushan
 * @date 2017/3/20.
 */
public class Run {
    public static void main(String[] args) throws InterruptedException {
        final MyObject myObject=new MyObject();
        Thread thread1=new Thread(){
            @Override
            public void run() {
                super.run();
                myObject.setValue("a","aa");
            }
        };
        thread1.setName("a");
        thread1.start();
        Thread.sleep(500);
        Thread thread2=new Thread(){
            @Override
            public void run() {
                super.run();
                myObject.printUserNamePassword();
            }
        };
        thread2.start();
    }
}

実行結果は次のとおりです.
  a  !
a 11

Javaマルチスレッドコアプログラミング技術から抜粋-1.8.3