线程原子操作synchronized-lock CAS(AtomicInteger)
# 线程原子性操作
![image.png](https://cos.easydoc.net/31477061/files/km4isokh.png)
- ,它要么完整的被执行,要么完全不执行,这种要么操作100%完成,要么无操作的特性,就叫做原子性。
## synchronized
- synchronized是Java中的关键字,是一种同步锁,一个线程执行完了才可以执行下一个线程
- 独占锁是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。而另一个更加有效的锁就是乐观锁CAS
![image.png](https://cos.easydoc.net/31477061/files/km4jblgi.png)
## lock java提供了实现类ReentrantLock和读写锁 ReentrantReadWriteLock。
### ReentrantLock
![image.png](https://cos.easydoc.net/31477061/files/km4jnmct.png)
- Lock不是Java语言内置的,synchronized是Java语言的关键字,因此是内置特性。Lock是一个类,通过这个类可以实现同步访问;
- Lock和synchronized有一点非常大的不同,采用synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用;而Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。
## CAS,Compare and Swap。 比较并交换
- 所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁用到的机制就是CAS,Compare and Swap。
### AtomicInteger AtomicLong
AtomicInteger i = new AtomicInteger(0);
i.getAndIncrement(); //原子上增加一个当前值。(加1)
i.getAndAdd(2); //原子上增加(2)个当前值(参数是几就 加几)。
i.set(1); //设置为给定值。
1.getAndDecrement() //原子减1当前值。
### LongAdder DoubleAdder
- 数组类的 会生成多个AtomicLong 进行cas操作 然后相加就可以得出全部
- 适用于大量线程并发 不用都抢一个 减少自旋
[jdk1.8中文文档](https://www.matools.com/api/java8)
![image.png](https://cos.easydoc.net/31477061/files/km4rjk6b.png)
### LongAccumulator
```
public static void main(String[] args) throws InterruptedException {
/**/
LongAccumulator accumulator=new LongAccumulator(
(x,y)->{
System.out.println("x="+x+",,"+"y="+y);
return x+y;
},0L
);
for (int i=0 ;i<10 ;i++){
s++;
accumulator.accumulate(s);
}
Thread.sleep(200);
System.out.println(accumulator.get());
}
```
## CAS的问题
![image.png](https://cos.easydoc.net/31477061/files/km5vg3xr.png)
![image.png](https://cos.easydoc.net/31477061/files/km5vkejw.png)