…
好记性不如烂笔头,————————————在我的小仓库。
承接上文,在了解Java线程是什么以及如何创建之后,我们来了解一下synchronized的使用吧
提问
【经典卖火车票问题】
即将过年了,又要到疯狂的抢票环节,每个人通过手机进入app或者网页端进行抢票,若某列车一共火车票2000张,网友们纷纷同一时间购入,排除服务器故障压力,如何控制火车票不会多卖出?
为什么会出现会卖多的问题呢?不应该获取一个卖一个,怎么会卖多呢?
我们举一个例子, 假设有ABC三个人购票,这里通过线程模拟三个人购入情况,AB线程获取到当前票数2000,A当机立断付款,当前票数1999,B发现没钱,正在往银行卡打钱,C此时网速加载好了,获取到当前的1999票数并且购入,B此时也有钱了,在已经获取到的票数上-1,因此就会出现所谓的线程不安全。
synchronized
- 对于同步方法,锁是当前实例对象,即
this
,对该类其他实例对象无影响。 - 对于静态同步方法,锁是当前对象的 Class 对象, 影响其他该类的实例化对象。
- 对于同步方法块,锁是
synchronized
括号里配置的对象。
也就是说,我们可以利用synchronized
修饰类,类中的方法或者方法块。如下面的代码,分别对应上述三种情形。
使用方式
public class synchronizedTest implements Runnable {
static synchronizedTest instance=new synchronizedTest();
public void run() {
synchronized(instance){
//同步代码块
}
}
// 类中的同步方法
void synchronized method1() {}
// 类中静态同步方法
void static synchronized method2() {}
}