1. 程式人生 > >Java 執行緒同步

Java 執行緒同步

執行緒同步:保證多個執行緒同時讀取一個類中的共享資料的執行緒安全
Java所有物件都有一個內建鎖,使用 synchronized 關鍵字修飾方法或程式碼塊時將為當前物件加鎖,一個執行緒獲取鎖後,其他執行緒需要等待該執行緒執行完畢後解鎖。
修飾方法:
private synchronized void function() {}
修飾程式碼塊:
private void function() {
    synchronized (object) {}
}

鎖加在 object 物件上面。該物件可以是當前物件(object == this),也可以是當前類的Class物件(object == MyClass.class)

簡單例子,多執行緒操作同一賬戶

執行緒類:

public class SynchronizedThread extends Thread {

	private Account account;
	private int cash;

	public SynchronizedThread(String name, Account account, int cash) {
		super(name);
		this.account = account;
		this.cash = cash;
	}

	@Override
	public void run() {
		account.plus(cash);
	}

	public static void main(String[] args) {
		Account at = new Account(100);
		for (int i = 0; i < 5; i++) {
			new SynchronizedThread("A" + i, at, -10).start();
		}
	}

}

賬戶類(未同步):

public class Account {

	private int money;

	public Account(int money) {
		this.money = money;
	}

	// 業務方法
	public void plus(int cash) {
		try {
			int last = money;
			Thread.sleep(1); // 模擬一個延遲
			money += cash;
			System.out.println(Thread.currentThread().getName() + ": 錢包: " + last + " 消費: " + cash + " 餘額: " + money);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}

未同步時,執行結果:


進行執行緒同步後:

同步方法:

public synchronized void plus(int cash) {
		try {
			int last = money;
			Thread.sleep(1); // 模擬一個延遲
			money += cash;
			System.out.println(Thread.currentThread().getName() + ": 錢包: " + last + " 消費: " + cash + " 餘額: " + money);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
或同步程式碼塊:
public void plus(int cash) {
		try {
			synchronized (this) {
				int last = money;
				Thread.sleep(1); // 模擬一個延遲
				money += cash;
				System.out.println(Thread.currentThread().getName() + ": 錢包: " + last + " 消費: " + cash + " 餘額: " + money);
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
執行結果:



相關推薦

Java執行-同步和非同步的區別

1.                                         &nb

java執行同步方法

1.同步方法     synchronized修飾方法,物件內建鎖保護整個方法(物件鎖)     若方法static修飾,類鎖 2.同步程式碼塊     同步—高開銷—減少同步內容 3.wait和notify   &n

Java 執行同步方式

Java中synchronized關鍵字鎖定的是物件。驗證程式碼如下: class Demo { public synchronized void sayHello(){ try{ System.out.println("hello start");

JAVA執行同步 waite,notify, notifyAll

public class MyObject { private static Object lock = new Object(); public void methidA(){ synchronized (lock){ for(in

JAVA 執行同步 synchronized

  synchronized public void methidA(){ for(int i = 0; i< 100;i++){ System.out.println("methidA"); try{ Thread.sleep(5); }

Java執行同步的認識

synchronized關鍵字 Java以提供關鍵字synchronized的形式,以防止多執行緒時資源衝突提供了內建支援。當任務要執行被synchronized關鍵字保護的程式碼片段時,它將檢查鎖是否可用,然後獲取鎖,執行程式碼,釋放鎖。 所有物件都自動含

java執行---同步方法

關鍵字synchronized方法方法上修飾,那麼該方法就是同步方法。同步方法分為 :非靜態同步方法和靜態同步方法。程式碼如下:非靜態同步方法package sx.test.thread;public class Demo4 {public static void main(

java 執行同步和非同步

ava執行緒 同步與非同步 執行緒池 1)多執行緒併發時,多個執行緒同時請求同一個資源,必然導致此資源的資料不安全,A執行緒修改了B線 程的處理的資料,而B執行緒又修改了A執行緒處理的數理。顯然這是由於全域性資源造成的,有時為了解 決此問題,優先考慮使用區域性變數,退

java執行同步5種方式

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

實現Java執行同步的五種方法

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

Java --- 執行同步和非同步的區別

1. Java 執行緒 同步與非同步 多執行緒併發時,多個執行緒同時請求同一個資源,必然導致此資源的資料不安全,A執行緒修改了B執行緒的處理的資料,而B執行緒又修改了A執行緒處理的數理。顯然這是由於全域性資源造成的,有時為了解決此問題,優先考慮使用區域性變數,

java執行同步的5種方式(轉載)

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

Java執行同步的五種方式

1、同步方法,使用synchronized關鍵字修飾的方法。 2、同步程式碼塊,使用synchronized關鍵字修飾的程式碼塊。 3、使用特殊域變數(volatile)實現執行緒同步。 4、使用reentrantLock(重入鎖)實現執行緒同步。 5、使用區域性變數(Thr

Java 執行同步、死鎖

執行緒同步(保證執行緒安全:沒有鎖的執行緒只能等)獲取鎖 釋放鎖 執行慢 public class ThreadDemo { //買門票例子 public static void main(String[] args) { MyTicket mt= new MyTicket(); //建立任務 /MyT

Java執行同步:synchronized鎖住的是程式碼還是物件

在Java中,synchronized關鍵字是用來控制執行緒同步的,就是在多執行緒的環境下,控制synchronized程式碼段不被多個執行緒同時執行。synchronized既可以加在一段程式碼上,也可以加在方法上。 關鍵是,不要認為給方法或者程式碼段加上synchron

JAVA#執行同步方法'札記

public static void main(String[] args) { Shixian s1=new Shixian(); Thread t1=new Thread(s1); t1.setName("宋小艾"); t1.st

Java 執行同步

執行緒同步:保證多個執行緒同時讀取一個類中的共享資料的執行緒安全 Java所有物件都有一個內建鎖,使用 synchronized 關鍵字修飾方法或程式碼塊時將為當前物件加鎖,一個執行緒獲取鎖後,其他執行緒需要等待該執行緒執行完畢後解鎖。修飾方法:private synchronized void functi

java 執行同步問題之銀行存取款問題

public class SaveAndFetchMoney {  /**   *   */  public static void main(String[] args) {   int num_of_save = 20; // 存款執行緒數   int num_of_f

Java執行同步工具-Semaphore

Semaphore:訊號燈 特點:控制每次執行的執行緒數,達到控制執行緒併發的效果 測試程式碼 package com.zhiwei.thread; import java.util.Rand

java-執行同步

執行緒世界出現了一把鎖幸好還是又聰明人的,有人想到了一個解決問題的好方法。雖然不知道誰想到的注意,但是這個注意確實解決了一部分問題,解決的方案是加鎖。你想要進行對一組加鎖的程式碼進行操作嗎?想的話就先去搶到鎖,拿到鎖之後就可以對被加鎖的程式碼為所欲為了,倘若拿不到鎖的話就只能