继承AQS 实现其主要方法

  1. package com.shadow.aqs;
  2. import java.util.concurrent.locks.AbstractQueuedLongSynchronizer;
  3. import java.util.concurrent.locks.Condition;
  4. public class CustomSync extends AbstractQueuedLongSynchronizer {
  5. @Override
  6. public boolean tryAcquire(long acquires) {
  7. if (compareAndSetState(0, acquires)) {
  8. setExclusiveOwnerThread(Thread.currentThread());
  9. return true;
  10. }
  11. return false;
  12. }
  13. @Override
  14. protected boolean tryRelease(long arg) {
  15. if(getState() == 0) {
  16. throw new IllegalMonitorStateException();
  17. }
  18. setExclusiveOwnerThread(null);
  19. setState(0);
  20. return true;
  21. }
  22. @Override
  23. protected boolean isHeldExclusively() {
  24. return getState()==1;
  25. }
  26. public Condition newCondition() {
  27. return new ConditionObject();
  28. }
  29. }

实现Lock接口实现加锁解锁

  1. package com.shadow.lock;
  2. import com.shadow.aqs.CustomSync;
  3. import lombok.extern.slf4j.Slf4j;
  4. import java.util.concurrent.TimeUnit;
  5. import java.util.concurrent.locks.*;
  6. @Slf4j(topic = "enjoy")
  7. public class LockTest10 implements Lock{
  8. CustomSync customSync = new CustomSync();
  9. @Override
  10. public void lock() {
  11. customSync.acquire(1);
  12. }
  13. @Override
  14. public void lockInterruptibly() throws InterruptedException {
  15. customSync.acquireInterruptibly(1);
  16. }
  17. @Override
  18. public boolean tryLock() {
  19. return customSync.tryAcquire(1);
  20. }
  21. @Override
  22. public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
  23. return customSync.tryAcquireNanos(1, unit.toNanos(time));
  24. }
  25. @Override
  26. public void unlock() {
  27. customSync.release(1);
  28. }
  29. @Override
  30. public Condition newCondition() {
  31. return customSync.newCondition();
  32. }
  33. public static void main(String[] args) throws InterruptedException {
  34. LockTest10 l = new LockTest10();
  35. new Thread(()->{
  36. l.lock();
  37. log.debug("xxx");
  38. try {
  39. TimeUnit.SECONDS.sleep(5);
  40. } catch (InterruptedException e) {
  41. e.printStackTrace();
  42. }
  43. l.unlock();
  44. },"t1").start();
  45. TimeUnit.SECONDS.sleep(1);
  46. l.lock();
  47. log.debug("main");
  48. l.unlock();
  49. }
  50. }