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
关键字时,只能一个线程先进入,结束后,第二个线程才能在进入执行,就会出现先打印一个程序开始和结束,在开始和结束另一个程序。