複数のスレッドが同じリソースを共有 (アクセス) する可能性があります
たとえば、同じオブジェクト、同じ変数、同じファイルにアクセスする場合
複数のスレッドが同じリソースにアクセスすると、スレッド セーフティの問題と呼ばれるデータの混乱やデータ セキュリティの問題が発生しやすくなります。
スレッド セーフティの問題はどのような状況で発生しますか。
複数のスレッドが、同じリソース
そして少なくとも 1 つのスレッドが書き込み操作を実行しています
入金と出金がそれぞれ 2 つのスレッドがあります
入金 出金
スレッド 1 残高 スレッド 2
1000 "----1000-----" 1000
1000 1000---- -》 2000
500 "-----1000-500
正解: 終了後の残高は 500 ではなく 1500 である必要があります
2 スレッド
# スレッド 1 チケット番号 スレッド 2
1000 "---- 1000 -------" 1000
# 1000-1--- --》999
999 "-----1000-1
正解: 終了後の残高は 999 ではなく 998 である必要があります
チケット購入エラー (そうではありません)スレッド同期) 例:
public class love implements Runnable{ private int piao=3000;//有3000张票 public boolean sale() {//ture代表还有票;false代表没有票了 if(piao<1) return false; piao--;//卖1张票 //细化piao--; //寄存器=piao; //寄存器=寄存器-1; //piao=寄存器; String sk =Thread.currentThread().getName();//获取当前线程(买票窗口)的名字 System.out.println(sk+"卖了1张票,还剩下"+piao+"张"); return piao>1; } public void run() { while(sale());//循环执行;直至卖完票返回false } } public class Main { public static void main(String[] a) { love tjlove =new love(); for(int i=1;i<=4;i++) {//循环4次;产生4个线程(窗口)卖票 Thread tj = new Thread(tjlove()); tj.setName(""+i); tj.start(); } } }
部分的な出力結果:
##スレッドの安全性の問題分析の問題スレッド A およびB 値 17 を持つクラス内の 1 つの変数に対して 1 つの操作を実行します。最終結果は 2 です。 18
に変更され、ロック期間中は他のスレッドから 17 にアクセスできません。
変更後、Enter を書き込み、次にロック解除 17
次に、スレッド B がそれにアクセスし、ロックし、上記の操作を繰り返して 19 になり、ロックを解除します。
これにより、同時に 1 つのスレッドだけがアクセスすることが保証されるため、セキュリティが保証されます。前のエラーこれらのスレッドが一緒にアクセスしていることが原因でした
public class love implements Runnable{ private int piao=3000;//本人cpu单核性能过强,数据量大些才能看到是4个线程在卖票 public boolean sale() { synchronized(this) {//1个线程获取这个对象的锁,并加锁; synchronized作用于整个语句 //this指向当前对象 //不能用new Object();这样会产生新的对象,产生新的锁 //把this换成"123",效果基本一样;因为其存在常量值里,每次访问的对象一样 if(piao<1) return false; piao--; String sk =Thread.currentThread().getName(); System.out.println(sk+"卖了1张票,还剩下"+piao+"张"); return piao>0; } } public void run() { while(sale()); } }
public class love implements Runnable{ private int piao=3000; public synchronized boolean sale() { //synchronized作用于整个方法 if(piao<1) return false; piao--; String sk =Thread.currentThread().getName(); System.out.println(sk+"卖了1张票,还剩下"+piao+"张"); return piao>0; } public void run() { while(sale()); } }
したがって、使用するのは本当に必要な場合のスレッド同期テクノロジー
以上がJava スレッドの安全性と同期の分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。