自旋锁是一种乐观锁,和悲观锁不同,比如synchronized,乐观锁不会先尝试获取锁,而是直接做操作,通过一定判断条件来决定是否执行操作。
悲观锁的一大缺点是不管存不存在竞态条件,都会加锁,要是并发量高,锁的时间又长,那将性能堪忧。
而乐观锁从本质上来说,已经不存在锁的概念了。每个线程在操作前会先校验与其他线程存在共享的数据,如果存在这样的数据,那将会一直校验,直到没有共享的数据,然后再执行操作。
下面是一个简单的示例
private AtomicReference<Thread> cas = new AtomicReference<Thread>(); public void lock() { Thread currentThread = Thread.currentThread(); while (!cas.compareAndSet(null, currentThread)) { } } public void unlock() { Thread currentThread = Thread.currentThread(); cas.compareAndSet(currentThread , null); }
这个自旋锁的问题是不公平,等待时间较长的线程并不一定会较先获得锁。但性能优先,缺点还是可以忍受的。线程一直处于活跃状态,不会阻塞,减少了上下文切换。