学习笔记
多线程中的非同步问题主要出现在对域的读写上,如果让域自身避免这个问题,则就不需要修改操作该域的方法。
用final域,有锁保护的域和volatile域可以避免非同步的问题。
-
volatile关键字为域变量的访问提供了一种免锁机制,
-
使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新,
-
因此每次使用该域就要重新计算,而不是使用寄存器中的值
-
volatile不会提供任何原子操作,它也不能用来修饰final类型的变量
简单点说,就是
定义变量的时候在前面加一个volatile
volatile int money2 = 100000; //使用volatile方法实现线程同步
这是目前我发现最简单的方法
如果有更简单的同步线程的方法请在评论区留言,学习
示例
柜台和ATM同时取钱
//使用volatile方法实现线程同步
//
public class ren2 implements Runnable {
volatile int money2 = 100000; //使用volatile方法实现线程同步
public ren2() {
Thread t1=new MyThread();
t1.start();
}
@Override
public void run() { //柜台取钱
while (true) {
money2 = money2 - 3;
System.out.println("柜台取了两块钱,现在还有:" + money2);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class MyThread extends Thread { //ATM取钱
public void run() {
while (true) {
money2 = money2 - 1;
System.out.println("ATM取了一块钱,现在还有:" + money2);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
ren2 t2=new ren2();
Thread t3=new Thread(t2);
t3.start();
}
}
水平有限,如有错误,还望大神指正;(^_−)☆