Javaのアドレスのセキュリティ問題への同期的な方法を用いることによるセキュリティ上の問題点を解決するために、マルチスレッド。
マルチスレッドのアドレスセキュリティの問題は、Javaのは、以下の3つの方法が用意されています。
同期方法
シンクブロック
Javaのjucパッケージ(ロック機構)
安全ではないが、同時に同一のリソースを使用して複数のスレッドを生成するスレッド、スレッドは不安が付属しています。
例えば:
パブリック クラスシネマ{ 公共 静的 ボイドメイン(文字列[]引数){ TicketOfficeオフィス = 新しいTicketOffice()。 // 创建3个售票员 スレッドseller1 = 新しいスレッド(オフィス); スレッドseller2 = 新しいスレッド(オフィス); スレッドseller3 = 新しいスレッド(オフィス); seller1.start(); seller2.start(); seller3.start(); } } クラス TicketOffice 実装Runnableを{ // 定义10张电影票 int型 = 10チケット; @Override 公共 無効RUN(){ しばらく(チケット> 0 ){ 試み{ のThread.sleep( 100 ); } キャッチ(InterruptedExceptionあるE){ e.printStackTrace(); } //は、映画のチケットの販売を開始、各マイナス1自動的に、映画のチケットを販売 するSystem.out.println(にThread.currentThread()のgetName()+は、+(ticket--)+ "最初販売されている" "チケットを!" ); } } }
結果:
そこ発券(複数の女性と結婚するために、複数の票を販売)を繰り返し、状況は反対票ですされています。
プラスのThread.sleep()だけで、エラーの確率の増加を取得します
スレッド0がチケット10を販売している! スレッド -1 10は!チケットを販売している スレッド -2 10がチケットを販売している! スレッド -1 9は、チケットを販売している! スレッド -2 9は、チケットを販売しています! スレッド -0 9は!チケットを販売している スレッド -1 8がチケットを販売している! スレッド -2 7は、チケットを販売している! スレッド -0 8がチケットを販売している! スレッド -0 6は、チケットを販売しています! スレッド -1 4は!チケットを販売している スレッド -2 5がチケットを販売している! スレッド -0 3は、チケットを販売している! スレッド -2 2がチケットを販売している! スレッド -1 3は、チケットを販売しています! スレッド -1最初のチケットが販売されている! スレッドを -2 -1チケットを販売している! スレッド -0 0はチケットを販売しています!
シンクブロック
以下は、コードの構文のシンクブロックであります
同期(OBJ){ // ローカルニーズ同期 // OBJ任意の共有リソース(オブジェクト)、同期コードは、同期対象のブロックであってもよいです }
同期コードブロックに従うことによって問題を解決するために、発券
パブリック クラスシネマ{ 公共 静的 ボイドメイン(文字列[]引数){ TicketOfficeオフィス = 新しいTicketOffice()。 // 创建3个售票员 スレッドseller1 = 新しいスレッド(オフィス); スレッドseller2 = 新しいスレッド(オフィス); スレッドseller3 = 新しいスレッド(オフィス); seller1.start(); seller2.start(); seller3.start(); } } クラス TicketOffice 実装Runnableを{ // 定义10张电影票 int型チケット= 10 ; オブジェクトOBJ = 新しい新しいオブジェクト(); // ここはクラスで記述する必要がありますが、ない書き込み方法を行う // 内部法に書かれたリソースの共有であるクラスの書き込みは、各スレッドが持っています自身のリソースは、共有されていない @Override 公共 ボイドRUN(){ 同期(OBJ){ 一方(チケット> 0 ){ 試み{ のThread.sleep( 100 ); } キャッチ(InterruptedExceptionあるE){ e.printStackTrace() ; } // 自動的にマイナス1、映画のチケットを販売していなかった映画のチケットの販売を開始 System.out.println(。にThread.currentThread()のgetName( )+ "が販売されて最初の" +(ticket--)+ "のチケット!" ); } } } }
同期方法
修飾子同期メソッドの戻り値名(){ // メソッドメンバ }
スレッドセーフなメソッドを同期させることによって、問題を解決するために、
パブリック クラスシネマ{ 公共 静的 ボイドメイン(文字列[]引数){ TicketOfficeオフィス = 新しいTicketOffice()。 // 创建3个售票员 スレッドseller1 = 新しいスレッド(オフィス); スレッドseller2 = 新しいスレッド(オフィス); スレッドseller3 = 新しいスレッド(オフィス); seller1.start(); seller2.start(); seller3.start(); } } クラス TicketOffice 実装Runnableを{ // 定义10张电影票 int型 = 10チケット; オブジェクトOBJ = 新しい新しいオブジェクト(); // このクラスはオフに記述する必要がありますが、この方法リー書いていない // 各スレッドがあり、内部の方法に書かれたリソースの共有であるクラスに書き込みを自身のリソース、それではない共有 @Override 公共 ボイドRUN(){ sellTicket(); } // 同期方法 パブリック 同期 ボイドsellTicket(){ 一方(チケット> 0 ){ 試み{ のThread.sleep( 100 ); } キャッチ(InterruptedExceptionあるE){ e.printStackTrace(); } // 自動的にマイナス1、映画のチケットを販売していなかった映画のチケットの販売を開始 するSystem.out.println(にThread.currentThreadを()。メソッドgetName()+ +(ticket--) "最初に販売されました" + "チケット「!); } } }
参考文献:
https://www.geeksforgeeks.org/synchronized-in-java/
https://www.cnblogs.com/xckxue/p/8685675.html
アリプログラマー:
https://www.jianshu.com/p/f9b1159d4fde
https://www.jianshu.com/p/2ed498b43628
https://segmentfault.com/a/1190000013512810