1. 程式人生 > >關於執行緒同步的問題(區域性變數實現執行緒同步)

關於執行緒同步的問題(區域性變數實現執行緒同步)

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元。