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

關於執行緒同步的問題(特殊域變數(volatile)實現執行緒同步)

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