线程同步
线程同步
同步代码块
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--;
}
}
?
}
?
}
同步方法
1.把共同访问的数据总结抽取出来,放进一个方法里面。
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对象
@Override
public void run() {
?
while(true){
r.lock();
try{
if(tickets>0) {
System.out.println(Thread.currentThread().getName() + "-->" +"正在出售第"+tickets+"票");
tickets--;
}
}
finally {
r.unlock();
}
?
}
?
线程同步
原文:https://www.cnblogs.com/stydejava/p/13436748.html