可同时执行指定数量的任务

  1. /**
  2. * 可同时执行指定数量的任务
  3. *
  4. * @author wujianchuan 2020/9/29 11:43
  5. */
  6. public class ParallelLock {
  7. private final Sync sync;
  8. public ParallelLock(int parallelThreadCount) {
  9. sync = new Sync(parallelThreadCount);
  10. }
  11. static final class Sync extends AbstractQueuedSynchronizer {
  12. private static final long serialVersionUID = 8083049666357266306L;
  13. Sync(int count) {
  14. setState(count);
  15. }
  16. @Override
  17. protected int tryAcquireShared(int arg) {
  18. for (; ; ) {
  19. int count = getState();
  20. int newCount = count - arg;
  21. //NOTE: 小于0获取同步状态失败
  22. if (newCount < 0 || compareAndSetState(count, newCount)) {
  23. return newCount;
  24. }
  25. }
  26. }
  27. @Override
  28. protected boolean tryReleaseShared(int arg) {
  29. for (; ; ) {
  30. int count = getState();
  31. int newCount = arg + count;
  32. if (compareAndSetState(count, newCount)) {
  33. return true;
  34. }
  35. }
  36. }
  37. }
  38. public void lock() {
  39. sync.acquireShared(1);
  40. }
  41. public void unlock() {
  42. sync.releaseShared(1);
  43. }
  44. }