同步代码块
synchronized(监视器){
//共同享用的代码块
}
多个线程在抢夺cpu执行权,在执行run()方法,遇到synchronized代码块时,会检查是否有锁对象,如果有,就继续执行下去。反则,该线程就会进入阻塞状态。直到锁对象被释放,多个线程就会继续抢夺cpu执行权。
Object obj = new Object();//监视器
public void run() {
while(true){
synchronized (obj){
if(tickets>0) {
System.out.println(Thread.currentThread().getName() + "-->" +"正在出售第"+tickets+"票");
tickets--;
}
}
}
}
同步方法
2.格式是 :修饰符 synchronized 返回值类型 方法名(参数列表){
//共享的数据;
}
public void run() {
while(true){
sell();
}
}
public synchronized void sell(){
synchronized (obj){
if(tickets>0) {
System.out.println(Thread.currentThread().getName() + "-->" +"正在出售第"+tickets+"票");
tickets--;
}
}
}
使用lock锁
步骤:
1.在成员位置创建一个ReentrantLock对象
2.在可能出现线程安全代码前调用:ReentrantLock的lock()方法。
注:将可能出现线程安全代码放进try{}中
3.在finally{}中调用unlock()
Lock r = new ReentrantLock();//1.在成员位置创建一个ReentrantLock对象