java多執行緒之synchronized與lock、wait與notify
與lock配套使用的還有condition,jdk1.8中描述,Condition因素的 Object監測方法( wait, notify和 notifyAll)為不同的物件給在每個物件的多個等待集的影響,結合 Lock實現任意使用。在 Lock取代 synchronized方法和語句的使用,一個 Condition取代物件監視器的使用方法。class Res { public String name; public String sex; public Boolean flag = false; public Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); } class InputThread extends Thread { private Res res; public InputThread(Res res) { this.res = res; } @Override public void run() { int count = 0; while (true) { try { // 開鎖 res.lock.lock(); if (res.flag) { try { // 使執行緒阻塞阻塞 res.condition.await(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (count == 0) { res.name = "小明"; res.sex = "男"; } else { res.name = "小紅"; res.sex = "女"; } count = (count + 1) % 2; // 將flag設定為 true 說明已經寫完了 res.flag = true; } catch (Exception e) { // TODO: handle exception } finally { // 喚醒執行緒 res.condition.signal(); // 解鎖 res.lock.unlock(); } } } } class OutThread extends Thread { private Res res; public OutThread(Res res) { this.res = res; } @Override public void run() { while (true) { try { res.lock.lock(); if (!res.flag) { try { // 使執行緒阻塞阻塞 res.condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(res.name + "---" + res.sex); // 將狀態改為false 說明已經讀完了 res.flag = false; } catch (Exception e) { // TODO: handle exception } finally { // 喚醒執行緒 res.condition.signal(); //解鎖 res.lock.unlock(); } } } } public class ThreadDemoLock { public static void main(String[] args) { Res res = new Res(); InputThread inputThread = new InputThread(res); OutThread outThread = new OutThread(res); inputThread.start(); outThread.start(); } }
相關推薦
java多執行緒之synchronized與lock、wait與notify
class Res { public String name; public String sex; public Boolean flag = false; public Lock lock = new ReentrantLock(); Condition condition = lock.new
Java多執行緒之—Synchronized方式和CAS方式實現執行緒安全效能對比
效能比較猜想 1.大膽假設 在設計試驗方法之前,針對Synchronized和CAS兩種方式的特點,我們先來思考一下兩種方式效率如何? 首先,我們在回顧一下兩種方式是如何保證執行緒安全的。Synchronized方式通過大家應該很熟悉,他的行為非常悲觀,只要有一個執行緒進
Java 多執行緒之synchronized關鍵字詳解
package com.example; /** * Created by 晁東洋 on 2017/5/27. */ public class MyThreadClass { public static void main(String args[]){ Exampletest
JAVA多執行緒之Synchronized關鍵字--物件鎖的特點
一,介紹 本文介紹JAVA多執行緒中的synchronized關鍵字作為物件鎖的一些知識點。 所謂物件鎖,就是就是synchronized 給某個物件 加鎖。關於 物件鎖 可參考:這篇文章 二,分析 synchronized可以修飾例項方法,如下形式: 1 public class My
java多執行緒之synchronized和volatile關鍵字
synchronized同步方法 髒讀 在多個執行緒對同一個物件中的例項變數進行併發訪問的時候,取到的資料可能是被更改過的,稱之為“髒讀”,這就是非執行緒安全的。解決的方法為synchronized關鍵字進行同步,使之操作變成同步而非非同步。 public
Java多執行緒中 synchronized和Lock的區別
我們已經瞭解了Java多執行緒程式設計中常用的關鍵字synchronized,以及與之相關的物件鎖機制。這一節中,讓我們一起來認識JDK 5中新引入的併發框架中的鎖機制。 我想很多購買了《Java程式設計師面試寶典》之類圖書的朋友一定對下面這個面試題感到非常熟悉: 問:請對比synchronized與java
Java多執行緒之synchronized詳解
## 目錄 - synchronized簡介 - 同步的原理 - 物件頭與鎖的實現 - 鎖的優化與升級 - Monitor Record - 鎖的對比 ## synchronized簡介 `synchronized`關鍵字,一般稱之為“同步鎖”或者重量級鎖(JAVA SE 1.6之後引入了`偏向鎖`和`輕
java多執行緒之等待喚醒機制(wait-notify)
wait()、notify()、notifyAll()方法 Object類裡面提供了這幾個方法: wait():讓當前執行緒處於等待(阻塞狀態),直到其他執行緒呼叫此物件的notify()或noti
JAVA多執行緒之——自旋鎖、CLH、MCS
自旋鎖 學習瞭解自旋鎖之前先回顧一下互斥鎖 互斥鎖 執行緒在獲取互斥鎖的時候,如果發現鎖已經被其它執行緒佔有,那麼執行緒就會驚醒休眠,然後在適當的時機(比如喚醒)在獲取鎖。 自旋鎖 那麼自旋鎖
JAVA多執行緒之volatile 與 synchronized 的比較
一,volatile關鍵字的可見性 要想理解volatile關鍵字,得先了解下JAVA的記憶體模型,Java記憶體模型的抽象示意圖如下: 從圖中可以看出: ①每個執行緒都有一個自己的本地記憶體空間--執行緒棧空間???執行緒執行時,先把變數從主記憶體讀取到執行緒自己
java多執行緒之Lock--顯式鎖
Lock與Synchronized簡介 Synchornized相信大家用的已經比較熟悉了,這裡我就不介紹它的用法了 Synchronized被稱為同步鎖或者是隱式鎖,隱式鎖與顯式鎖區別在於,隱式鎖的獲取和釋放都需要出現在一個塊結構中,而且是有順序的,獲取鎖的順序和釋放鎖的順序必須相反,就是說,
Java多執行緒之 Lock介面和ReentrantLock的使用
在多執行緒開發中,除了synchronized這個關鍵字外,我們還能通過Lock介面來實現這種效果。通過Lock介面來實現這種多執行緒加鎖效果的好處是非常的靈活,我們不在需要對整個函式加鎖,而且可以很方便的把他放在我們函式的任何一個地方,非常的稱心,而且從效率上來說,使用Loc
Java多執行緒之Callable介面與Runnable的實現以及選擇
通過實現Runnable介面的實現 package Thread; import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors; public class RunnableThreadDemo { pr
java多執行緒之同步鎖(Lock)
從Java5開始,提供了Lock, Lock提供了比synchronized方法和synchronized程式碼塊更廣泛的鎖定操作,Lock可以實現更靈活的結構,並且支援多個相關的Condition物件(物件監視器)。 Lock是控制多個執行緒對共享
JAVA多執行緒之——經典面試消費者與生產者
用wait與notify、notifyAll 實現生產者與消費者 關於多執行緒的生產者與消費者有多種方式實現。目前用學過的wait、notifyAll來實現。程式碼: public class ThreadTest6 { static class
Java多執行緒之生產者消費者問題:使用synchronized 關鍵字解決生產者消費者問題
今天看了一片博文,講Java多執行緒之執行緒的協作,其中作者用程式例項說明了生產者和消費者問題,但我及其他讀者發現程式多跑幾次還是會出現死鎖,百度搜了下大都數的例子也都存在bug,經過仔細研究發現其中的問題,並解決了,感覺有意義貼出來分享下。
Java多執行緒之三volatile與等待通知機制示例
原子性,可見性與有序性 在多執行緒中,執行緒同步的時候一般需要考慮原子性,可見性與有序性 原子性 原子性定義:一個操作或者多個操作在執行過程中要麼全部執行完成,要麼全部都不執行,不存在執行一部分的情況。 以我們在Java程式碼中經常用到的自增操作i++為例,i++實際上並不是一步操作,而是首先對i的值加一,然
Java多執行緒之執行緒安全與非同步執行
多執行緒併發修改一個數據結構,很容易破壞這個資料結構,如散列表。鎖能夠保護共享資料結構,但選擇執行緒安全的實現更好更容易,如阻塞佇列就是執行緒安全的集合。 執行緒安全的集合 Vector和HashTable類提供了執行緒安全的動態陣列和散列表,而ArrayList和H
Java多執行緒之執行緒安全與同步例項
1.1 執行緒安全與同步例項 1.1.1 購票同步物件鎖 【 /* * 用程式模擬鐵路售票系統:實現通過兩個售票點發售某日某次列車的50張車票, * 一個售票點用一個執行緒表示 */ publicclass SyncDemo { publi
Java多執行緒之記憶體可見性和原子性:Synchronized和Volatile的比較
在刷題時,碰到一題:關於volatile關鍵字的說法錯誤的是: A. 能保證執行緒安全 B volatile關鍵字用在多執行緒同步中,可保證讀取的可見性 C JVM保證從主記憶體載入到執行緒工做記憶體的值是最新的 D volatile能禁止指令進行指令重排序 答案:A 處