@Slf4j
public class SychronizedExample1 {
//test1方法和test2方法的作用是一样的
public void test1(int j){
synchronized (this){
for (int i = 0; i <10 ; i++) {
log.info("test1 - {} - {}",j,i);
}
}
}
public synchronized void test2(int j){
for (int i = 0; i <10 ; i++) {
log.info("test2 - {} - {}",j,i);
}
}
public static void main(String[] args) {
SychronizedExample1 sychronizedExample1 = new SychronizedExample1();
SychronizedExample1 sychronizedExample2 = new SychronizedExample1();
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(new Runnable() {
@Override
public void run() {
sychronizedExample1.test1(1);
}
});
ExecutorService executorService2 = Executors.newCachedThreadPool();
executorService.execute(new Runnable() {
@Override
public void run() {
sychronizedExample2.test2(2);
}
});
}
}
可以发现sychronizedExample1的test1方法和sychronizedExample2的test2并行执行。说明sychronizedExample1作用在当前类对象上,当前对象获得锁不影响其他线程锁的获取。
修改成红框标注的类以后,相同的类对象,只有一个可以获得锁,另一个必须等前一个释放锁。
再次修改将test1和test2修改成静态类,就算是new 两个SychronizedExample1类,依然只有一个方法可以获得锁,sychronized的作用范围变成了类(而不是类对象)