JAvaスレッドのセキュリティ問題の解決方法
14232 ワード
JAvaスレッドのセキュリティ問題の解決方法 Runnableインタフェース種を書き換えるrunメソッド さっき書いたインスタンスオブジェクトを作成してNew 1つのThreadオブジェクトを呼び出しましょうさっきのインスタンスオブジェクトを入れstartメソッドで を実行します.
安全上の問題の原因
このケースでは、3つのスレッドを開き、3つのスレッドが実行権を奪い、if文を実行するとcpu実行権が失われ、速度が速すぎて最初のスレッドを実行すると同時に印刷されます.
解決策同期コードブロック 同期メソッド定義フォーマット修飾子synchronized戻り値タイプメソッド名(パラメータリスト){共有データのコード/問題のあるコードに重複データが発生する可能性がある} ロック機構 public class ReentrantLock implements Lock, java.io.Serializable ロックを使用する場合ロックサブクラスrenntrantlock を呼び出す必要がある Lockはより先進的であり、lockでロックunlock解放ロック を取得することができる.
package cn.tread;
public class runnable implements Runnable {
private int ticket =100;
@Override
public void run() {
while (true){
if (ticket>0){
System.out.println(Thread.currentThread().getName()+" "+ticket+" ");
ticket--;
}
}
}
package cn.tread;
public class demo {
public static void main(String[] args) {
runnable demo1= new runnable();
// Thread // Thread runnable
Thread to1 = new Thread(demo1);
Thread to2 = new Thread(demo1);
Thread to3 = new Thread(demo1);
to1.start();
to2.start();
to3.start();
}
}
安全上の問題の原因
このケースでは、3つのスレッドを開き、3つのスレッドが実行権を奪い、if文を実行するとcpu実行権が失われ、速度が速すぎて最初のスレッドを実行すると同時に印刷されます.
解決策
package cn. ;
public class runnable implements Runnable {
private int ticket =100;
Object obj = new Object();
@Override
public void run() {
while (true){
// synchronized
// Synchronized Java ,
synchronized (obj){
if (ticket>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" "+ticket+" ");
ticket--;
}else {
break;
}
}
}
}
package cn. ;
public class runnable implements Runnable {
private int ticket =100;
Object obj = new Object();
@Override
public void run() {
while (true){
//
//
payket();
}
}
public synchronized void payket(){
if (ticket>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" "+ticket+" ");
ticket--;
}
}