线程同步机制:
多个线程访问同一资源时,造成数据不一致,此时需对多个线程间进行协调。(例如:银行取钱时线程同时过去,会导致数据判断不正确,此时需将并行的的操作改为串行)
主要上锁(synchronized)方式(3种):
1.在要执行的run方法下加一段
synchronizde(一个引用){锁住的部分}
,这里面的引用需自定义一个类如下代码的Demo
类,然后new它的对象,它的引用就是过好礼的引用;
第二种和第三种是相同的,只是写法不同,第二个就是直接在重写的run方法里加个
synchronized
关键字,第三种是写在run方法下的synchronized(this){锁住的代码块}
,里面的this从底层里可得知是线程创建的对象的直接调用run。
Demo dm = new Demo;
@Override
第二种: public synchronized void run() {
// 在成员方法中出现this表示当前正在调用的对象,也就是acc
第三种: //synchronized(this) {
System.out.println("线程" + Thread.currentThread().getName() + "启动...");
第一种://synchronized(dm) { // ok
//synchronized(new Demo()) { // error
// 模拟从银行后台数据库查询账户余额的过程
int temp = getBalance(); // temp = 1000; temp = 1000;
// 模拟取款的操作
if(temp >= 200) {
System.out.println("正在出钞,请稍后...");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
temp -= 200; // temp = 800; temp = 800;
System.out.println("请取走您的钞票!");
} else {
System.out.println("账户余额不足,请核对您的账户余额!");
}
// 模拟将最新的余额写入后台数据库
setBalance(temp); //balance = 800; balance = 800;
//}
}
}
class Demo {
}