代码demo

这是一把带超时时间的自旋锁,如果超时时间内依然无法获取锁,就直接返回false

  1. package org.example.spinlock;
  2. import java.util.concurrent.TimeUnit;
  3. import java.util.concurrent.atomic.AtomicBoolean;
  4. /**
  5. * 自旋锁
  6. */
  7. public class SpinLockTest {
  8. public static void main(String[] args) {
  9. SpinLock spinLock = SpinLock.get();
  10. for (int i = 0; i < 3; i++) {
  11. new Thread(()->{
  12. boolean success = spinLock.tryLock(2000);
  13. if (!success){
  14. System.out.println(Thread.currentThread().getName()+" get spin lock fail...");
  15. return;
  16. }
  17. System.out.println(Thread.currentThread().getName()+" get spin lock success...");
  18. try {
  19. TimeUnit.SECONDS.sleep(3);
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }
  23. System.out.println(Thread.currentThread().getName()+" TODO 业务逻辑...");
  24. spinLock.unLock();
  25. }).start();
  26. }
  27. }
  28. }
  29. class SpinLock{
  30. private SpinLock(){}
  31. private final static SpinLock spinLock = new SpinLock();
  32. public static SpinLock get(){
  33. return spinLock;
  34. }
  35. private final AtomicBoolean available = new AtomicBoolean(false);
  36. // 尝试获取锁,成功返回true,失败返回false
  37. public boolean tryLock(long timeout){
  38. long deadline = System.currentTimeMillis()+timeout;
  39. while (System.currentTimeMillis()<deadline) {
  40. if (available.compareAndSet(false, true)){
  41. return true;
  42. }
  43. }
  44. return false;
  45. }
  46. public void unLock(){
  47. available.compareAndSet(true,false);
  48. }
  49. }

执行结果

  1. Thread-0 get spin lock success...
  2. Thread-1 get spin lock fail...
  3. Thread-2 get spin lock fail...
  4. Thread-0 TODO 业务逻辑...


思考

自旋锁如何设计能够最大程度降低空转时间?
(后期有空去优化,可以参考JDK AQS底层的自旋机制)