并发编程
并发编程
并发编程是任何语言在项目中都会使用的方式,这里就以Java的语言来实现并发编程。并发编程的线程安全是我们需要关注的重点
实现线程的方式
- 实现Callable和Future
- 实现Runnable
- Thread的匿名Runnable
CountDownLatch#
class CountRunnable implements Runnable {
CountDownLatch latch;
public CountRunnable(CountDownLatch latch) {
this.latch = latch;
}
@Override
public void run() {
//TODO 执行你的任务
System.out.println("CountRunnable " + System.currentTimeMillis());
try {
Thread.sleep(100);
latch.countDown();//减1
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
CountDownLatch countDownLatch = new CountDownLatch(4);
for (int i = 0; i < 10; i++) {
Thread thread = new Thread(new CountRunnable(countDownLatch));
thread.start();
}
countDownLatch.await();//当前线程等待CountDownLatch任务执行完成
Semaphore来同步线程#
//1 允许线程可以同时访问的数量
//true 表示线程的顺序是按照次序的, false是表示线程访问是随机顺序的
Semaphore available = new Semaphore(1, true);
available.acquire();//可访问的线程数量减1
available.release();//可访问的线程数量加1
Synchronization来同步线程#
- 同步方法
public synchronized void fun() {}
- 同步对象
public void fun() {synchronized(this){}}
private static int t = 0;
Object mutex = new Object();
ExecutorService executorService = Executors.newFixedThreadPool(400);
// The high thread count is for demonstration purposes.
for (int i = 0; i < 100; i++) {
executorService.execute(() -> {
synchronized (mutex) {
t++;
System.out.println(MessageFormat.format("t: {0}", t));
}
});
}
executorService.shutdown();
synchronized+wait和notify#
ReentrantLock#
Lock lockObj = new ReentrantLock();
public void doSomething() {
//其他地方的调用时 lockObj.lock();
boolean locked = lockObj.tryLock();
if (locked) {//解锁
try {
//TODO
} finally {
lockObj.unlock(); // sure to release the lock without fail
}
}
}
ReentrantLock+Condition#
private final Lock lock = new ReentrantLock();
private final Condition condition = lock.newCondition();
condition.await()会释放当前锁,进入等待状态;
condition.signal()会唤醒某个等待线程;
condition.signalAll()会唤醒所有等待线程;
ReadWriteLock 读写锁#
读可以多线程访问,写操作只能一个线程执行。如果有线程正在读的时候,写线程需要等待读线程释放锁后才能获取写线程,是一种悲观锁。StampedLock锁就解决了这种问题,但是会带来,读线程的在写线程的前后数据不一致,是一种乐观锁。
Concurrent包#
- 集合
interface | non-thread-safe | thread-safe |
---|---|---|
List | ArrayList | CopyOnWriteArrayList |
Map | HashMap | ConcurrentHashMap |
Set | HashSet / TreeSet | CopyOnWriteArraySet |
Queue | ArrayDeque / LinkedList | ArrayBlockingQueue / LinkedBlockingQueue |
Deque | ArrayDeque / LinkedList | LinkedBlockingDeque |
- Atomic类
线程的join()#
不适合多线程的操作,但是如果就2个线程的话可以使用
线程池+同步线程队列#
作者:kevin2022
出处:https://www.cnblogs.com/kevin2022/p/16404728.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
你可以在这里自定义其他内容
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术