synchronized 是 Java 中的关键字,它的作用是一把锁,也就是在 Java 的多线程中会有很多并发的现象,多个线程访问同一段逻辑代码。这个时候就需要给这段代码加上一个锁来确保代码的的原子性,也就是保证代码运行出来的效果和自己想的一致。
synchronized 的使用方式有:
synchronized (一个对象) { ...... }
public void synchronized m1 () { ...... }
下面给一段代码参考
public class SyncBlockDemo { public static void main(String[] args) { Web12306 web12306 = new Web12306(); new Thread(web12306, "票贩一").start(); new Thread(web12306, "票贩二").start(); new Thread(web12306, "票贩三").start(); new Thread(web12306, "票贩四").start(); new Thread(web12306, "票贩五").start(); } } class Web12306 implements Runnable { private Integer tickets = 10; private Boolean flag = true; @Override public void run() { while (flag) { execute(); } } void execute() { // 此处多加一个if判断是做了代码的优化,当一个线程购买了最后一张票后,这个时候其他的线程在进入此方法时判断tickets, // 票卖完后就直接停掉当前进入的线程,此时这些线程就不会在再synchronized所前等待执行下边代码了。但是这个判断只是对 // 代码的优化。因为有一种情况是在剩最后一张票的时候若是有两个或者以上的线程都满足这个if判断后就会造成这几个线程都 // 执行到获取缩的这一步,而且此时他们获取的tickets都是1,所以在synchronized代码块中就需要再做一次判断,防止数据 // 不一致,这里的两个if判断又称为double check if (tickets <= 0) { flag = false; return; } synchronized (this) { if (tickets <= 0) { flag = false; return; } System.out.println(Thread.currentThread().getName() + " 购票:" + tickets--); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
原文:https://www.cnblogs.com/alu-bigdata/p/11295824.html