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; } }
*先存后取,账户数据正确。负数是因为存取钱是随机数。