- synchronized是悲观锁,这种线程一旦得到锁,其他需要锁的线程就挂起的情况就是悲观锁。
- CAS操作的就是乐观锁,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。
CAS .java
import java.util.concurrent.atomic.AtomicInteger;
/**
* CAS乐观锁
*/
public class CAS {
//库存
private static AtomicInteger stock = new AtomicInteger(5);
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
new Thread(()->{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Integer left = stock.decrementAndGet();
if (left < 1){
System.out.println("抢完了");
return;
}
System.out.println(Thread.currentThread().getName()+ "抢了一件商品");
System.out.println("还剩" + left);
}).start();
}
}
}
运行结果:
Thread-1抢了一件商品
还剩4
Thread-2抢了一件商品
还剩3
Thread-3抢了一件商品
还剩2
Thread-4抢了一件商品
还剩1
抢完了