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