标签:img rac getname cat ret catch pre err 影响
关键字synchronized可以写在方法和代码块中
关于这个synchronized关键字
关于线程锁
下面来看一个没有加线程锁的案例:3个线程抢票
package _20191205;
/**
* 线程不安全:
* @author TEDU
*/
public class SynTest01 {
public static void main(String[] args) {
//一份资源
SafeWeb12306 web = new SafeWeb12306();
new Thread(web,"线程1").start();
new Thread(web,"线程2").start();
new Thread(web,"线程3").start();
}
}
class SafeWeb12306 implements Runnable{
//票数
private int ticketNums = 100;
private boolean flag = true;
@Override
public void run() {
while(flag) {
try{
Thread.sleep(100);
}catch(InterruptedException e) {
e.printStackTrace();
}
buy();
}
}
//买票:线程不安全
public void buy() {
if(ticketNums<=0) {
flag = false;
return;
}
try {
Thread.sleep(100);
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);
}
}
它的运行结果:

会出现多个线程抢了同一张票的情况,为了避免这种情况,我们需要给关键方法加锁,在本例中,我们只需要给buy()方法加锁即可,即:
public void synchronized buy(){...}
标签:img rac getname cat ret catch pre err 影响
原文地址:https://www.cnblogs.com/Scorpicat/p/11988453.html