造成原子性的问题就是线程的上下文切换,例如long类型在进行加减操作就会有风险。
在单核时代下,我们禁止上下文切换就可以解决,但现在是多核,并不能解决问题,但是我们只要保证,对通过一个变量,只能够有一个线程执行也能保证原子性。
通过锁来解决这个问题:

锁的模型

image.png
需要注意:加锁一定要解锁。不同的锁,锁的内容不一样,应该要有一一对应的关系。我家的锁只能锁我家的东西,你家的锁只能锁家的大门,很多bug都是因为这个原因。

Java中的Synchronize

Synchronize修饰静态方法相当于锁的是Class对象

  1. class X {
  2. // 修饰静态方法
  3. synchronized(X.class) static void bar() {
  4. // 临界区
  5. }
  6. }

Synchronize修改普通方法相当于锁的是当前的对象

  1. class X {
  2. // 修饰非静态方法
  3. synchronized(this) void foo() {
  4. // 临界区
  5. }
  6. }