關於執行緒同步的問題(特殊域變數(volatile)實現執行緒同步)
阿新 • • 發佈:2019-01-11
package com.bootdo.wang; /** * 3.使用特殊域變數(volatile)實現執行緒同步 * a.volatile關鍵字為域變數的訪問提供了一種免鎖機制, * b.使用volatile修飾域相當於告訴虛擬機器該域可能會被其他執行緒更新, * c.因此每次使用該域就要重新計算,而不是使用暫存器中的值 * d.volatile不會提供任何原子操作,它也不能用來修飾final型別的變數 */ public class VolatileKeywordSynchronization { class Bank { private volatile int accout = 10; public int getAccout() { return accout; } public void saveAccount(int money) { accout += money; System.out.println("account:" + accout); } } class VolatileThread implements Runnable { private Bank bank; public VolatileThread(Bank bank) { this.bank = bank; } @Override public void run() { for (int i = 0; i < 10; i++) { bank.saveAccount(10); System.out.println(Thread.currentThread().getName() + "-->第" + i + "次當前賬戶餘額:" + bank.getAccout() + "元。"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } public void userVolatileThread() { Bank bank = new Bank(); VolatileThread volatileThread = new VolatileThread(bank); Thread thread1 = new Thread(volatileThread); Thread thread2 = new Thread(volatileThread); System.out.println("執行緒1:"); thread1.start(); System.out.println("執行緒2:"); thread2.start(); } public static void main(String[] args) { VolatileKeywordSynchronization volatileKeywordSynchronization = new VolatileKeywordSynchronization(); volatileKeywordSynchronization.userVolatileThread(); } }
輸出:
執行緒1: 執行緒2: account:20 Thread-0-->第0次當前賬戶餘額:20元。 account:30 Thread-1-->第0次當前賬戶餘額:30元。 account:50 account:50 Thread-0-->第1次當前賬戶餘額:50元。 Thread-1-->第1次當前賬戶餘額:50元。 account:70 account:70 Thread-1-->第2次當前賬戶餘額:70元。 Thread-0-->第2次當前賬戶餘額:70元。 account:90 account:90 Thread-0-->第3次當前賬戶餘額:90元。 Thread-1-->第3次當前賬戶餘額:90元。 account:100 account:100 Thread-1-->第4次當前賬戶餘額:100元。 Thread-0-->第4次當前賬戶餘額:100元。 account:120 Thread-1-->第5次當前賬戶餘額:120元。 account:120 Thread-0-->第5次當前賬戶餘額:120元。 account:140 Thread-1-->第6次當前賬戶餘額:140元。 account:140 Thread-0-->第6次當前賬戶餘額:140元。 account:160 Thread-1-->第7次當前賬戶餘額:160元。 account:160 Thread-0-->第7次當前賬戶餘額:160元。 account:170 Thread-0-->第8次當前賬戶餘額:170元。 account:170 Thread-1-->第8次當前賬戶餘額:170元。 account:190 Thread-1-->第9次當前賬戶餘額:190元。 account:190 Thread-0-->第9次當前賬戶餘額:190元。