synchronized能够在同一时刻最多只有一个线程执行该代码
证明如下:
public class MyThread {public static void main(String[] args) throws InterruptedException {Ticket ticket = new Ticket();Thread aa = new Thread(() -> {try {ticket.getCount();} catch (Exception e) {throw new RuntimeException(e);}}, "aa");Thread bb = new Thread(() -> {try {ticket.getCount();} catch (Exception e) {throw new RuntimeException(e);}}, "bb");aa.start();bb.start();}}class Ticket {Object object = new Object();public void getCount() throws InterruptedException {/*synchronized (object) {*/System.out.println(Thread.currentThread().getName()+"线程开始");Thread.sleep(1000);System.out.println(Thread.currentThread().getName()+"线程结束");/*}*/}
}
① 当不加synchronized
时,输出结果
②添加 synchronized
执行结果
③验证
当不添加synchronized
关键字时,两个程序都可以进入到此代码块中,就会出现都先打印开始(因为sleep
的时间比较长),然后再打印结束;
而当添加synchronized
关键字时,只能一个线程先进入,结束后,第二个线程才能在进入执行,就会出现先打印一个程序开始和结束,在开始和结束另一个程序。