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

需要注意:加锁一定要解锁。不同的锁,锁的内容不一样,应该要有一一对应的关系。我家的锁只能锁我家的东西,你家的锁只能锁家的大门,很多bug都是因为这个原因。
Java中的Synchronize
Synchronize修饰静态方法相当于锁的是Class对象
class X {// 修饰静态方法synchronized(X.class) static void bar() {// 临界区}}
Synchronize修改普通方法相当于锁的是当前的对象
class X {// 修饰非静态方法synchronized(this) void foo() {// 临界区}}
