スレッドの安全性の問題とは何ですか
複数のスレッドが同じ共有する場合はメンバ変数や静的変数を 。実行(Do)の書き込み操作は確かに現象につながる、他のスレッドからの干渉を受ける質問スレッド安全性の問題でデータを呼び出し(運転データ衝突問題は発生しません読んでください)
例:
クラス threadTrain1 実装Runnableを{ // 重写実行()方法 プライベート 静的の int型のカウント数= 100 ; 公共 のボイドの実行(){ しばらく(数> 0 ){ 試み{ のThread.sleep( 50 )。 } キャッチ(例外e){ e.printStackTrace(); } 販売(); } } パブリック 無効の販売(){ 場合(カウント> 0 ){ System.out.println(。にThread.currentThread()のgetName() + "出售第" +(100 -数+ 1)+ "张票" ); カウント - ; } } } パブリック クラスthread_dame_1 { 公共 静的 ボイドメイン(文字列[]引数){ threadTrain1スレッド1 = 新しいthreadTrain1()。 スレッドT1 = 新しいスレッド(スレッド1、 "一号窗口" ); スレッドT2 = 新しいスレッド(スレッド1、 "二号窗口" ); t1.start(); t2.start(); } }
結果:
繰り返し部分のチケット販売
複数のスレッドがメンバ変数を共有する場合、データの競合が発生します
スレッドの安全性の問題を解決
同期または複数のスレッドの使用との間のアドレスセキュリティスレッドにロック(ロック)を使用して同期
ロックにどのようなニーズ
その一つのスレッドだけのアクセススレッド同期性を保証
二つ以上のスレッドが存在する必要があり、同期が発生する必要があります
複数のスレッドが同じロックを使用する必要があります同期させたい場合は、スレッドの同期は、他のスレッドからの干渉なしにリソースを共有しました
同期コード
同期(同じオブジェクト(ロック))// このオブジェクトはこのロックするために使用される任意のオブジェクトであることができる { // 衝突を発生することがあり、スレッドコードを }
例:
公共 のボイド販売(){ 同期(本){ 場合(カウント> 0 ){ System.out.printlnは(にThread.currentThread()のgetName()。 + "出售第" +(100 -数+ 1)+ "张票" ); カウント - ; } } }
または:
(方法の変形同期機能)
公共 同期 無効販売(){
場合(カウント> 0 ){
System.out.printlnは(。にThread.currentThread()のgetName() + "出售第" +(100 -数+ 1)+ "张票" );
カウント - ;
}
}
結果:
静的な同期機能
静的同期機能は、静的な同期機能を変更されます
静的には、静的な関数に属している静的な同期バイトコードを使用してこの機能をロックすることはできません
バイトコードCAN はgetClass()を直接得る方法または クラス名の.class 表します
例:
public static void sale() { synchronized (threadTrain1.class) { if (count > 0) { System.out.println(Thread.currentThread().getName() + " 出售 第 " + (100 - count + 1) + " 张票"); count--; } } }
多线程三大特性
原子性 , 可见性 , 有序性
原子性 : 保证数据一致, 保证线程安全
可见性 : 多个线程访问同一个变量时 , 一个线程修改了值 , 其他线程能立即得到修改的值,若2个线程不在同一个cpu , 那么线程a 改变了值 , b线程使用还是原来的值 , a 修改的值 b 没有看到 这就是可见性
有序性 : 程序执行的顺序按照先后顺序执行 如之前的 join()