自旋锁解析及自写自旋锁
1.什么叫自旋锁?
是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样做的好处是减少了线程的上下文切换的消耗,但是缺点是循环会消耗CPU
2.手写自旋锁
package com.example.demo;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
/**
* Created by Administrator on 2020/7/5.
* 手写自旋锁
*
* @author qtx
*/
public class SpinLockDemo {
AtomicReference<Thread> atomicReference=new AtomicReference<>();
public void MyLock(){
//获取当前调用的线程
Thread thread=Thread.currentThread();
//期待当前线程是null,则持有锁,否则自选
while (!atomicReference.compareAndSet(null,thread)){
System.out.println(Thread.currentThread().getName()+"\t No holding lock!");
}
System.out.println(Thread.currentThread().getName()+"\t hold lock!");
}
public void MyUnLock(){
//获取当前调用的线程
Thread thread=Thread.currentThread();
//期待当前线程是null,则持有锁,否则自选
atomicReference.compareAndSet(thread,null);
System.out.println(Thread.currentThread().getName()+"\t myUnlock!");
}
public static void main(String[] args) {
SpinLockDemo spinLockDemo=new SpinLockDemo();
new Thread(() -> {
spinLockDemo.MyLock();
//持锁5s钟
try {
TimeUnit.SECONDS.sleep(5);
}catch (Exception e){
e.printStackTrace();
}
spinLockDemo.MyUnLock();
}).start();
//保证第一个线程先得到锁
try {
TimeUnit.SECONDS.sleep(1);
}catch (Exception e){
e.printStackTrace();
}
new Thread(() -> {
spinLockDemo.MyLock();
//持锁2s钟
try {
TimeUnit.SECONDS.sleep(2);
}catch (Exception e){
e.printStackTrace();
}
spinLockDemo.MyUnLock();
}).start();
}
}