關於執行緒同步的問題(區域性變數實現執行緒同步)
阿新 • • 發佈:2018-12-31
package com.bootdo.wang; /** * 5.使用區域性變數實現執行緒同步 * 如果使用ThreadLocal管理變數,則每一個使用該變數的執行緒都獲得該變數的副本, * 副本之間相互獨立,這樣每一個執行緒都可以隨意修改自己的變數副本,而不會對其他執行緒產生影響。 * ThreadLocal 類的常用方法 * ThreadLocal() : 建立一個執行緒本地變數 * get() : 返回此執行緒區域性變數的當前執行緒副本中的值 * initialValue() : 返回此執行緒區域性變數的當前執行緒的"初始值" * set(T value) : 將此執行緒區域性變數的當前執行緒副本中的值設定為value * 注:ThreadLocal與同步機制 * a.ThreadLocal與同步機制都是為了解決多執行緒中相同變數的訪問衝突問題。 * b.前者採用以"空間換時間"的方法,後者採用以"時間換空間"的方式 */ public class ThreadLocalSynchronization { public class Bank { private ThreadLocal<Integer> account = new ThreadLocal<Integer>() { @Override protected Integer initialValue() { return 10; } }; public int getAccount() { return account.get(); } public void saveAccount(int money) { account.set(account.get() + money); } } class ThreadLocalThread implements Runnable { private Bank bank; public ThreadLocalThread(Bank bank) { this.bank = bank; } @Override public void run() { for (int i = 0; i < 100; i++) { bank.saveAccount(10); System.out.println(Thread.currentThread().getName() + "-->當前餘額:" + bank.getAccount() + "元。"); } } } public void userReentrantLockThread() { Bank bank = new Bank(); ThreadLocalThread threadLocalThread = new ThreadLocalThread(bank); Thread thread1 = new Thread(threadLocalThread); Thread thread2 = new Thread(threadLocalThread); thread1.start(); thread2.start(); } public static void main(String[] args) { ThreadLocalSynchronization threadLocalSynchronization = new ThreadLocalSynchronization(); threadLocalSynchronization.userReentrantLockThread(); } }
輸出:
Thread-0-->當前餘額:20元。 Thread-0-->當前餘額:30元。 Thread-0-->當前餘額:40元。 Thread-0-->當前餘額:50元。 Thread-0-->當前餘額:60元。 Thread-0-->當前餘額:70元。 Thread-0-->當前餘額:80元。 Thread-0-->當前餘額:90元。 Thread-0-->當前餘額:100元。 Thread-0-->當前餘額:110元。 Thread-1-->當前餘額:20元。 Thread-1-->當前餘額:30元。 Thread-1-->當前餘額:40元。 Thread-1-->當前餘額:50元。 Thread-1-->當前餘額:60元。 Thread-1-->當前餘額:70元。 Thread-1-->當前餘額:80元。 Thread-1-->當前餘額:90元。 Thread-1-->當前餘額:100元。 Thread-1-->當前餘額:110元。