執行緒同步與死鎖(3)
阿新 • • 發佈:2019-02-12
執行緒同步與死鎖
1、多執行緒共享資料
在多執行緒操作中,多個執行緒有可能同時處理同一個資源,這就是多執行緒中的共享資料
2、執行緒同步
解決資料共享問題必須使用同步,所謂的同步就是指多個執行緒在同一個時間段內只能有一個執行緒執行指定的程式碼,其他執行緒要等待此執行緒完成之後才可以繼續進行執行
3、實現執行緒同步的方法
3.1、同步程式碼塊
當寫synchronized快時,有幾個簡單的準則可以遵循,這些準則在避免死鎖和效能危險的風險方面大有幫助
(1):使程式碼塊保持簡短。把 不隨執行緒變化的預處理和後處理移出synchronized塊
(2):不要阻塞。如inputStream.read();
(3):在持有鎖的時候,不要對其他物件呼叫方法
synchronized(要同步的物件){
要同步的操作
}
class MyRunable5 implements Runnable {
private int ticket=10;//售票
private Object obj =new Object();
@Override
public void run() {
for (int i = 0; i <300 ; i++) {
synchronized (obj){
ticket--;
if (ticket > 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("您購買的票已剩餘:"+ticket+"張");
}
}
}
}
}
3.2、同步方法
//同步方法:同步的物件是當前物件this
private synchronized void method() {
if (ticket > 0) {
ticket--;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("您購買的票已剩餘:" + ticket + "張");
}
}
3.3、Lock
//互斥鎖
ReentrantLock lock = new ReentrantLock();
//Lock實現同步
private void method2() {
lock.lock();//鎖
try {
if (ticket > 0) {
ticket--;
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("您購買的票已剩餘:" + ticket + "張");
}
}finally {
lock.unlock();//解鎖
}
}
4、死鎖
過多的同步有可能出現死鎖,死鎖的操作一般是在程式執行時候才有可能出現的