快捷搜索: 王者荣耀 脱发

自旋锁理论知识与代码验证

自旋锁理论知识与代码验证

自旋锁

相对互斥锁,自旋锁是一种轻量级的锁,通过循环判断当前锁是否被其他线程获取,直到该线程获取到锁,才退出循环。自旋锁的优点是减少了线程上下文切换的消耗, 缺点是如果获取锁的线程一直处于活跃状态,则会占用大量的CPU资源消耗。

如JAVA中Atomic原子类就是用自旋锁的思想,以轻量级锁的方式实现原子性。

public final int getAndAddInt(Object var1, long var2, int var4) {
          
   
        int var5;
        do {
          
   
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

        return var5;
    }

自旋锁用JAVA代码进行验证

public class SpinLock {
          
   

 AtomicReference<Thread> atomicReference = new AtomicReference<Thread>();

 /**
  * @author: dongchao
  * @create: 2021/3/22-10:45
  * @description: 进行加CAS自旋
  * @param:
  * @return:
  */
 public void addLock(){
          
   
     Thread thread = Thread.currentThread();
     while (!atomicReference.compareAndSet(null,thread)){
          
   
         //直到对比成功 ,即想到于获取到锁,开始执行业务操作
     }
     System.out.println(thread.getName()+"获取到锁!");
 }

 /**
  * @author: dongchao
  * @create: 2021/3/22-10:45
  * @description: 解锁
  * @param:
  * @return:
  */
 public void unLock(){
          
   
     Thread thread = Thread.currentThread();
     System.out.println(thread.getName()+"获取释放锁!");
     atomicReference.compareAndSet(thread,null);
 }

 public static void main(String[] args) {
          
   
     SpinLock spinLock = new SpinLock();

     Thread thread1 = new Thread(() -> {
          
   
         spinLock.addLock();
         try {
          
   
             Thread.sleep(4000);
         } catch (InterruptedException e) {
          
   
             e.printStackTrace();
         }
         spinLock.unLock();
     },"thread1");
     thread1.start();


     Thread thread2 = new Thread(() -> {
          
   
         spinLock.addLock();
         try {
          
   
             Thread.sleep(1);
         } catch (InterruptedException e) {
          
   
             e.printStackTrace();
         }
         spinLock.unLock();
     },"thread2");

     thread2.start();
 }
}

将Thread1线程Sleep 4s ,即4s后Thread1才会释放锁,即这样线程Thread2需要在While循环不断的判断compareAndSet 4秒后才能获取到锁。

经验分享 程序员 微信小程序 职场和发展