java併發程式設計 執行緒同步

2021-09-24 09:15:01 字數 2153 閱讀 8259

sysynchronized關鍵字可以修飾方法、**塊,但不能修飾構造器、成員變數等。

當sysynchronized關鍵字同來修飾方法和**塊時,能夠保證同一時刻最多只有乙個執行緒執行該段**或方法。防止當有兩個執行緒併發修改同乙個檔案時可能會造成異常。

同步**塊語法:

synchronized(obj)

複製**

意思為:當執行緒要執行以下**塊之前,必須先獲得對obj的鎖。

然而,另乙個當乙個執行緒訪問object的乙個synchronized(this)**塊時,另乙個執行緒仍然可以訪問該object中的非synchronized(this)同步**塊,但是其他執行緒對object中其他所有的synchronized(this)同步**塊的訪問將被阻塞

示例:

public class thread1  catch (interruptedexception e)

}system.out.println("the synchronized part is over");}}

public void synchronize2

() catch (interruptedexception e)

}system.out.println("the synchronized part 2 is over");}}

public void nonsynchronize

() catch (interruptedexception e)

}system.out.println("the non-synchronized part is over");

}public static void main(string args)

});thread t2 = new thread(() -> thread1.synchronize2());

thread t3 = new thread(thread1::nonsynchronize);

t1.start();

t2.start();

t3.start();

}}複製**

輸出結果:

從輸出結果可以看出:執行緒0執行的是第乙個同步**塊,執行緒2執行的是非同步**塊,執行緒0和2同時執行,兩者互不干擾。執行緒1執行的是第二個同步**塊,因為執行緒0先獲得對該物件的鎖定,所以執行緒1即使執行**塊跟執行緒0不一樣,也被阻塞,必須等執行緒1執行完同步**塊,釋放鎖,執行緒1才能繼續執行。

public class thread1  catch (interruptedexception e)

}system.out.println("the synchronized method part is over");

}private synchronized void synchronize2

() catch (interruptedexception e)

}system.out.println("the synchronized method part 2 is over");

}private void nonsynchronize

() catch (interruptedexception e)

}system.out.println("the non-synchronized method part is over");

}public static void main(string args)

});thread t2 = new thread(() -> thread1.synchronize2());

thread t3 = new thread(thread1::nonsynchronize);

t1.start();

t2.start();

t3.start();

}}複製**

輸出結果跟同步**塊一樣:

lock 是控制多個執行緒對共享資源進行訪問的工具。每次只能有乙個執行緒對lock物件加鎖,執行緒開始訪問共享資源之前應先獲得lock物件。

在實現執行緒安全的控制中,比較常用的是reentrantlock。

class x  finally 

}}複製**

JAVA併發程式設計之多執行緒併發同步業務場景與解決方案

假如現在有20個人去售票廳買票,但是只有2個視窗,那麼同時只能有2個人買票,當2個人任意乙個人買好票離開之後,等待的18個人中又會有乙個人可以占用視窗買票 拆解 20個人就是20個執行緒 2個視窗就資源 實際含義就是 怎麼控制同一時間併發數為2 semaphore 訊號量 控制併發執行緒數 注意使用...

java併發程式設計 執行緒封閉

執行緒封閉有三種方式 ad hoc執行緒封閉 棧封閉 threadlocal類 其中ad hoc執行緒封閉一般由程式設計師自己實現,很少用,暫不介紹。將物件封閉在區域性變數中,只有區域性變數才能訪問,保證執行緒安全。下面我們來看一段簡單的 public class animals return nu...

Java併發程式設計 執行緒通訊

1.wait和notify方法 配合synchronize使用,屬於object方法 private volatile static list list new arraylist public void add public int size public static void main str...