1. 程式人生 > >實現執行緒同步的幾種方法

實現執行緒同步的幾種方法

  • 在多執行緒程式中,會出現多個執行緒搶佔一個資源的情況,這時間有可能會造成衝突,也就是一個執行緒可能還沒來得及將更改的 資源儲存,另一個執行緒的更改就開始了。可能造成資料不一致。因此引入多執行緒同步,也就是說多個執行緒只能一個對共享的資源進行更改,其他執行緒不能對資料進行修改。
  • 1.如下一個兩個執行緒對一個銀行賬戶進行存錢的小例項,其中使用synchornized修飾方法實現執行緒的同步
  • 程式碼如下:
class bank{
	private int count=100;
	public synchronized void dispit() {
		  count+=10;
	}
	public int getcount() {
		return count;
	}
}
class ThreadCount extends Thread{
	private bank count;
	private JTextArea textarea = new JTextArea();
	public ThreadCount(bank count,JTextArea textarea) {
		this.count = count;
		this.textarea = textarea;
	}
	public void run() {
		for(int i=0; i<10; i++) {
			count.dispit();
			textarea.append("賬戶餘額為:"+count.getcount()+"\n");
		}
	}
}

2.同步是一種高開銷的操作,因此應該儘量減少同步內容,因此也可以使用修飾程式碼塊來代替修飾整個方法。

class bank{
	private int count=100;
	public void dispit() {
		synchronized(this) {
		  count+=10;
		}
	}
	public int getcount() {
		return count;
	}
}
class ThreadCount extends Thread{
	private bank count;
	private JTextArea textarea = new JTextArea();
	public ThreadCount(bank count,JTextArea textarea) {
		this.count = count;
		this.textarea = textarea;
	}
	public void run() {
		for(int i=0; i<10; i++) {
			count.dispit();
			textarea.append("賬戶餘額為:"+count.getcount()+"\n");
		}
	}
}

3.使用volatile修飾資料,對於當下問題,只用使用volatile來修飾賬戶的餘額變數即可。該修飾詞是對域變數的訪問提供了以這種防鎖機制,相當於告訴虛擬機器,該域的變數可能被更改。因此每次使用該域都要重新計算,而不是從暫存器中取出資料。從而實現執行緒的同步。該修飾詞不能修改final型別變數

class bank{
	private volatile int count=100;
	public void dispit() {
		  count+=10;
	}
	public int getcount() {
		return count;
	}
}
class ThreadCount extends Thread{
	private bank count;
	private JTextArea textarea = new JTextArea();
	public ThreadCount(bank count,JTextArea textarea) {
		this.count = count;
		this.textarea = textarea;
	}
	public void run() {
		for(int i=0; i<10; i++) {
			count.dispit();
			textarea.append("賬戶餘額為:"+count.getcount()+"\n");
		}
	}
}

4.使用重入鎖實現執行緒同步。使用類ReentrantLock類來定義鎖,其中lock()方法為開啟鎖,unlock()方法為關閉鎖
類似於synchronized修飾方法有一樣功能。使用鎖時間需要注意應該及時放開鎖,不然會進入死鎖狀態。一般是在finally中釋放鎖

class bank{
	private volatile int count=100;
	private Lock lock = new ReentrantLock();
	public void dispit() {
		 lock.lock();
		 try {
		  count+=10;
		 }finally{
			 lock.unlock();
		 }
	}
	public int getcount() {
		return count;
	}
}
class ThreadCount extends Thread{
	private bank count;
	private JTextArea textarea = new JTextArea();
	public ThreadCount(bank count,JTextArea textarea) {
		this.count = count;
		this.textarea = textarea;
	}
	public void run() {
		for(int i=0; i<10; i++) {
			count.dispit();
			textarea.append("賬戶餘額為:"+count.getcount()+"\n");
		}
	}
}

程式碼的輸出結果如下:
在這裡插入圖片描述
可以看到,每次增加10 的時間只有一個執行緒在進行,也就是執行緒的同步

5.使用ThreadLocal類來管理。不過該方法和同步機制不相同。該類管理的變數在每個執行緒中都有自己的副本,副本之間相互獨立,因此獲得的結果和其他不同。

class bank{
	private static ThreadLocal<Integer> count = new ThreadLocal() {
	   protected Integer initialValue() {
		   return 100;
	   }
	};
	private Lock lock = new ReentrantLock();
	public void dispit() {
		 lock.lock();
		 try {
		  count.set(count.get()+10);
		 }finally{
			 lock.unlock();
		 }
	}
	public int getcount() {
		return count.get();
	}
}

class ThreadCount extends Thread{
	private bank count;
	private JTextArea textarea = new JTextArea();
	public ThreadCount(bank count,JTextArea textarea) {
		this.count = count;
		this.textarea = textarea;
	}
	public void run() {
		for(int i=0; i<10; i++) {
			count.dispit();
			textarea.append("賬戶餘額為:"+count.getcount()+"\n");
		}
	}
}

結果如圖:
在這裡插入圖片描述
可以看到,在改程式中,好比兩個賬戶相互獨立,互不干擾一樣。同樣解決了相同的變數訪問衝突問題。

相關推薦

設計模式之單例模式【內附物件例項化方式、實現執行安全方式】

繼續來複習常用的設計模式-單例模式,順便回憶一下執行緒安全的幾種實現方式。 一、什麼是單例模式 單例模式,簡單常用的一種設計模式,也很好的體現了程式碼控制物件在記憶體數量的一種方式,主要分2種實現方式: ①餓漢式,執行緒安全 ②懶漢式,執行緒不安全(新增鎖機制,可以實現執行緒安全)

執行(一):建立執行方法

概括來說就是兩種:1、繼承Thread類,重寫run方法,然後start。不推薦這種,因為java的單繼承特性。 2、Thread類的建構函式中可以接受Runnable任務,所以只要是Runnable例項就可以作為引數給Thread 一般有兩種建立Runnable例項的方法(1)實現Runn

Java 多執行 學習筆記(二)停止執行方法

1.異常法: package test; import exthread.MyThread; import exthread.MyThread; public class Run { pu

4. 執行同步方式

執行緒同步的方式主要有以下四種:臨界區(Critical Section)、互斥量(Mutex)、訊號量(Semaphore)、事件(Event)的區別。 他們的主要區別和特點如下: 1)臨界區:通過對多執行緒的序列化來訪問公共資源或一段程式碼,速度快,適合控制資料訪問。在任意時刻只允許一個執行緒對共

Java停止一個執行方法

Java中停止一個執行緒有三種方法,分別是stop,interrupt和設定標誌位,我們依次來看一下這三種方法。 首先不推薦使用stop方法,原因有兩點: 1、原則上只要一呼叫thread.stop()方法,執行緒就會立即停止,並丟擲ThreadDeath error,查看

iOS 執行同步方式

多執行緒同步目的有以下幾個方面:第一,對一段程式碼的執行進行保護,如果同時執行一段程式碼,中間的臨時變數可能會互相干擾造成結果不對;第二,對資源的保護,多個執行緒執行不同的程式碼,但是可能涉及同一個資源;第三,訊息傳遞,一個執行緒通知另外一個執行緒發生了一件事。

建立多執行方法

多執行緒有幾種實現方法,分別是什麼?(建立執行緒的幾種方式) 多執行緒有三種實現方法: 1、繼承Thread類,重寫run()方法。然後直接new這個物件的例項,建立一個執行緒的例項,再呼叫start()方法啟動執行緒。(其實本質上Thread是實現了Runnabl

java多執行之使用interrupt停止執行方法

停止執行緒 停止執行緒是java多執行緒開發中很重要的技術點,實際工作中很多業務都有類似的需求,掌握此技術可以對業務中所需停止的執行緒做有效的處理。但是停止執行緒在java語言中並不像break語句中那樣乾脆簡單,還需要我們做一下技巧性的處理。 如何更好的停

建立多執行方法?如何建立執行

多執行緒有幾種實現方法? 多執行緒實現又3種方法,其中前兩中是常用的方法,推薦第二種方法,一個類應該在其修改或者加強是才繼承 1.繼承Thread類,重寫run()方法,例項化該類,呼叫執行緒start()方法 (1)自定義類,繼承Thread類,重寫run()方法 (2

Python併發程式設計之建立多執行方法

今天的內容會比較基礎,主要是為了讓新手也能無障礙地閱讀,所以還是要再鞏固下基礎。學完了基礎,你們也就能很順暢地跟著我的思路理解以後的文章。本文目錄學會使用函式建立多執行緒學會使用類建立多執行緒多執行緒:必學函式講解經過總結,Python建立多執行緒主要有如下兩種方法:函式類接

Android將任務拋到UI執行方法

有的時候,我們希望能將任務拋回到UI執行緒去做,比如修改介面。如果當前沒有處在UI執行緒,那應該怎麼把任務拋到UI執行緒去呢? 以下是Android系統提供的3個將任務拋回UI執行緒的方法 Activity.runOnUiThread(Runnable)View.po

java多執行同步5方法

一、引言前幾天面試,被大師虐殘了,好多基礎知識必須得重新拿起來啊。閒話不多說,進入正題。二、為什麼要執行緒同步因為當我們有多個執行緒要同時訪問一個變數或物件時,如果這些執行緒中既有讀又有寫操作時,就會導致變數值或物件的狀態出現混亂,從而導致程式異常。舉個例子,如果一個銀行賬戶

建立執行方法及比較

1、通過繼承Thread類建立執行緒 (1).首先定義一個類去繼承Thread父類,重寫父類中的run()方法。在run()方法中加入具體的任務程式碼或處理邏輯。(2).直接建立一個ThreadTest類的物件,也可以利用多型性,變數宣告為父類的型別。 (3).呼叫

執行實現方法?同步實現方法?

為何要使用同步? java允許多執行緒併發控制,當多個執行緒同時操作一個可共享的資源變數時(如資料的增刪改查),  將會導致資料不準確,相互之間產生衝突,因此加入同步鎖以避免在該執行緒沒有完成操作之前,被其他執行緒的呼叫,  從而保證了該變數的唯一性和準確性。 同步的

【多執行實現執行同步方法(一)

前言 最近小扁我被問到 實現執行緒同步有哪幾種方法,而我只知道使用同步關鍵字synchronized來實現而已(⊙o⊙),,所以有必要來學習一下實現執行緒同步的幾種方法;各位看官,若有非議(不接受反駁),請不吝賜教! 實現執行緒同步的幾種方法 從我自己

實現執行同步方法

在多執行緒程式中,會出現多個執行緒搶佔一個資源的情況,這時間有可能會造成衝突,也就是一個執行緒可能還沒來得及將更改的 資源儲存,另一個執行緒的更改就開始了。可能造成資料不一致。因此引入多執行緒同步,也就是說多個執行緒只能一個對共享的資源進行更改,其他執行緒不能

實現執行同步方式總結

在多執行緒中執行緒的執行順序是依靠哪個執行緒先獲得到CUP的執行權誰就先執行,雖然說可以通過執行緒的優先權進行設定,但是他只是獲取CUP執行權的概率高點,但是也不一定必須先執行。在這種情況下如何保證執行緒按照一定的順序進行執行,今天就來一個大總結,分別介紹一下幾種方式。 通

java多執行實現方法

          方法一:繼承Thread類,覆蓋方法run(), public class MyThread extends Thread { int count= 1, number; public MyThread(int num) { number = num;

java中實現執行同步的7方法

同步的方法: 一、同步方法   即有synchronized關鍵字修飾的方法。 由於java的每個物件都有一個內建鎖,當用此關鍵字修飾方法時, 內建鎖會保護整個方法。在呼叫該方法前,需要獲得內建鎖,否則就處於阻塞狀態。 注: synchronized關鍵字也可以修飾靜態方法

實現執行同步方式

為何要使用同步? java允許多執行緒併發控制,當多個執行緒同時操作一個可共享的資源變數時(如資料的增刪改查), 將會導致資料不準確,相互之間產生衝突,因此加入同步鎖以避免在該執行緒沒有完成操作之前,被其他執行緒的呼叫, 從而保證了該變