今天一起来认识认识 「synchronized」 这个一面试就会被提到的关键字。这一篇不会讲太多理论,主要先熟悉熟悉一下最简单的用法。只讨论一个问题:「方法没用 synchronized 和用了 synchronized 有什么区别?」
首先我们的理论基础是 「synchronized」 关键字是用在多线程并发的场景,所以接下来的测试代码都会模拟多线程并发的情况。我们直接通过代码来给大家讲讲加没加 synchronized 的区别。
我们先写一个普通到不能再普通的代码,就是一个实例方法,在多线程并发的情况下执行同一个方法。如下所示。
public class NoSynchronizedTest {
public static void main(String[] args) {
NoSynchronizedTest noSynchronizedTest = new NoSynchronizedTest();
for (int i = 0; i < 5; i ++) {
Thread thread = new Thread(() -> {
noSynchronizedTest.testNoSynchronizedMethod();
});
thread.start();
}
}
public void testNoSynchronizedMethod() {
System.out.println("testNoSynchronizedMethod-start-" + Thread.currentThread().getName());
System.out.println("testNoSynchronizedMethod-end-" + Thread.currentThread().getName());
}
}
运行结果:
我们可以发现如下结论:
我们对上面的代码稍加修改,在方法上加 「synchronized」 修饰,并且在两种情况下执行代码。
public class SynchronizedTest {
public static void main(String[] args) {
SynchronizedTest synchronizedTest = new SynchronizedTest();
for (int i = 0; i < 5; i++) {
Thread thread = new Thread(() -> {
synchronizedTest.testSynchronizedMethod();
});
thread.start();
}
}
public synchronized void testSynchronizedMethod() {
System.out.println("testSynchronizedMethod-start-" + Thread.currentThread().getName());
System.out.println("testSynchronizedMethod-end-" + Thread.currentThread().getName());
}
}
运行结果:
public class SynchronizedTest {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
SynchronizedTest synchronizedTest = new SynchronizedTest();
Thread thread = new Thread(() -> {
synchronizedTest.testSynchronizedMethod();
});
thread.start();
}
}
public synchronized void testSynchronizedMethod() {
System.out.println("testSynchronizedMethod-start-" + Thread.currentThread().getName());
System.out.println("testSynchronizedMethod-end-" + Thread.currentThread().getName());
}
}
运行结果:
我们可以发现如下结论:
由此,我们可以得出什么呢?「synchronized」 关键字就是「悲观锁」的具体实现,在多线程并发竞争同一资源时,实现同一时刻只有一个线程能操作资源。
这篇文章是了解 「synchronized」 最最最皮毛的知识,对 「synchronized」 熟悉的朋友可以当做是回顾知识点,不熟悉的朋友可以当做是入门,后面会继续深挖知识点。