Java多线程
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()
-
返回当前计数
-
- countDown()