1. 程式人生 > >java多執行緒之synchronized與lock、wait與notify

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.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();
	}

}
與lock配套使用的還有condition,jdk1.8中描述,Condition因素的 Object監測方法( wait, notify和 notifyAll)為不同的物件給在每個物件的多個等待集的影響,結合 Lock實現任意使用。在 Lock取代 synchronized方法和語句的使用,一個 Condition取代物件監視器的使用方法。

相關推薦

java執行synchronizedlockwaitnotify

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執行synchronizedLock的區別

我們已經瞭解了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執行——自旋鎖CLHMCS

自旋鎖 學習瞭解自旋鎖之前先回顧一下互斥鎖 互斥鎖 執行緒在獲取互斥鎖的時候,如果發現鎖已經被其它執行緒佔有,那麼執行緒就會驚醒休眠,然後在適當的時機(比如喚醒)在獲取鎖。 自旋鎖 那麼自旋鎖

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 處