「Java」Java代码中加不加synchronized ,有什么区别?

【「Java」Java代码中加不加synchronized ,有什么区别?】
「Java」Java代码中加不加synchronized ,有什么区别?
文章图片
「Java」Java代码中加不加synchronized ,有什么区别?
文章图片
「Java」Java代码中加不加synchronized ,有什么区别?
文章图片
在Java中 synchronized 这个一面试就会被提到的关键字 。 只讨论一个问题:方法没用 synchronized 和用了 synchronized 有什么区别?
首先我们的理论基础是 synchronized 关键字是用在多线程并发的场景 , 所以接下来的测试代码都会模拟多线程并发的情况 。 我们直接通过代码来给大家讲讲加没加 synchronized 的区别 。
1. 方法没加 synchronized 关键字我们先写一个普通到不能再普通的代码 , 就是一个实例方法 , 在多线程并发的情况下执行同一个方法 。 如下所示 。
我们可以发现如下结论:在单线程中 , 执行顺序是有保证的 , 也就是每个 start 都优先于 end 。 在多线程中 , 线程之间的 start 和 end 是没有先后顺序的 , 先进入方法的线程不一定先执行完方法 。 我们看运行结果的红色框 , 5 个线程只有 Thread-2 是完整的执行完方法 , 没有其他线程乱入的 。
2. 方法加 synchronized 关键字我们对上面的代码稍加修改 , 在方法上加 synchronized 修饰 , 并且在两种情况下执行代码 。
5个线程只有一个 synchronizedTest 对象 。
5 个线程中 , 每个线程有各自的 synchronizedTest 对象 。
我们可以发现如下结论:当 5 个线程中只有一个对象时 , 5 个线程之间的执行顺序是串行的 , 互不影响 , 线程0进入方法后 , 其他线程就无法再进入方法了 , 得等待线程0执行完后 , 其他线程才能进入 , 并且一次只能有1个线程进入 。 每个线程一个对象时 , 就不会出现排队的场景 , 各个线程互不影响 , 相当于每个线程都有各自的资源 , 没有互相竞争的关系 。 由此 , 我们可以得出什么呢?synchronized 关键字就是悲观锁的具体实现 , 在多线程并发竞争同一资源时 , 实现同一时刻只有一个线程能操作资源 。