マルチスレッド(3)

1.なぜ同期とjava.util.concurrent.locks.Lock?

1>スレッドセーフ、スレッドがランダムであるので、それを見ることができるランダムアクセス、共有変数。共有変数が変更された場合、別のスレッド動作は、そのデータが正確ではありません

2>安全でないデータは、データが共有されています

これは共有変数、視認性とアトミックであります

3>コマンドを並べ替えます(as-if-serial)

 

   加锁,是只一个线程可以访问,其他线程等待访问的线程结束,后面的线程由cpu随机分配访问。

*スレッド状態

线程状态:创建->就绪->运行->死亡

线程从就绪状态被唤醒,运行时,有其他线程正在运行且访问的是它要访问的内容,那么,它会阻塞。

阻塞->就绪

休眠状态:即等待(阻塞)状态

运行时,如果cpu随机分配线程抢占了当前线程的资源,该线程进入就绪状态。

パブリック クラスアカウント{ 

    プライベート 長いお金= 0; // 余额
    
    パブリックアカウント(){} 
    
    公共 長い cunQian(INT NUM){ // 存钱 
        お金=お金+ NUM。
        戻り値のNUM; 
    } 
    
    公共 長い quQian(int型 NUM){ // 取钱 
         お金=お金- NUM。
         戻り値のNUM; 
    } 
    
    パブリック ロングgetMoney(){
         戻りお金。
    } 
}
輸入java.util.Randomの。

パブリック クラス Thread02は拡張スレッド{ 

    プライベートアカウントACC = ヌル;
    公共Thread02(アカウントACC){
         この .ACC = ACC。
    } 
    @Override 
    公共 ボイドラン(){
         長い cunQian = acc.cunQian(新しいランダム()nextInt(1000 ))。
        System.out.println( "存了:" + cunQian + ";账户内有:" + acc.getMoney())。
        長い quQian = acc.quQian(新しいランダム()nextInt(1000 )); 
        System.out.printlnは("私が取った:" + quQian + ";アカウントは持っている:" + acc.getMoney()); 
    } 

}

いいえロックません

パブリック クラスThread02Main { 

    公共 静的 ボイドメイン(文字列[]引数){ 
        アカウントACC = 新しいアカウント()。
        Thread02 T1 = 新しいThread02(ACC)。
        Thread02 T2 = 新しいThread02(ACC)。
        Thread02 T3 = 新しいThread02(ACC); 
        t1.start(); 
        t2.start(); 
        t3.start(); 
        
    } 
}

 

*無秩序とデータエラーが(有効性を比較し、ロックされました)

 

 

ロック

import java.util.Random;

public class Thread02 extends Thread{

    private Account acc = null;
    public Thread02(Account acc){
        this.acc = acc;
    }
    @Override
    public void run() {
        synchronized (acc) {
            long cunQian = acc.cunQian(new Random().nextInt(1000));
            System.out.println("存了:"+cunQian+";账户内有:"+acc.getMoney());
            long quQian = acc.quQian(new Random().nextInt(1000));
            System.out.println("取了:"+quQian+";账户内有:"+acc.getMoney());
        }
    }

}
public class Account {

    private long money = 0;
    
    public Account(){}
    
    public synchronized long cunQian(int num){//存钱
        money  = money + num;
        return num;
    }
    
    public synchronized long quQian(int num){//取钱
         money = money - num;
         return num;
    }
    
    public long getMoney(){
        return money;
    }
}








*先存后取,账户数据正确。负数是因为存取钱是随机数。

おすすめ

転載: www.cnblogs.com/zzlcome/p/11085343.html