LeetCode并发打印

  • 思路:定义一些公共的变量,作为限制关键部分代码的锁

方案一:AutomicInteger

  • 原子类
  • 所有操作均满足原子性
    • 对于一组操作要么全部执行成功,要么全部执行失败
  • 利用CAS技术
    AtomicInteger firstJobDone = new AtomicInteger(0);
    AtomicInteger secondJobDone = new AtomicInteger(0);
    

    方案二: Lock锁

Lock lock;
Condition condition1, condition2, condition3;

方案三:semaphore信号量

  • 信号量
    • 用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源
    • 一般用于流量的控制,特别是公共资源有限的场景,例如数据库的连接
    • 通过AQS的共享锁机制实现的
  Semaphore semaphore12, semaphore23;
  semaphore12.aquire();
  semaphore12.release();

方案四:CountDownLatch(减法计数器)

  • CountDownLatch可以使当前线程阻塞,等待其他线程完成给定任务。
  • 一个线程等待多个线程完成给定任务后,然后执行后续的操作。
  • 接收一个int类型的参数作为计数器,如果想等待N个点完成,就传入N。
  • N可以是N个线程,也可以是N个执行步骤
  • count参数必须大于等于0
  • 方法
    • countDown()
      • 计数器减一
    • await()
      • 阻塞当前线程,直到计数器变成0
    • getCount()
      • 返回当前计数