当使用了synchronized
于方法之上,或者使用synchorionized (this)
时,类中的所有同步代码以及同步代码块都将被加锁,同时只有一个线程能够访问类中方法;执行完后又由其他cpu竞争锁
示例
public static void main(String[] args) {
new Thread(psvm::say).start();
new Thread(psvm::say).start();
new Thread(psvm::show).start();
new Thread(psvm::show).start();
}
public void say() {
synchronized (this) {
log.info("say!");
try {
// wait(1000);
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public synchronized void show() {
log.info("show!");
try {
// wait(1000);
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}
}
执行结果
由于say中的同步代码块锁定了下面的show同步方法,导致show必须等待say的休眠结束才能重新开始锁的竞争