1:线程池

与每次需要时都创建线程相比,线程池可以降低创建线程的开销,这也是因为线程池在线程执行结束后进行的是回收操作,而不是真正的

销毁线程。

2:ReentrantLock

ReentrantLock提供了tryLock方法,tryLock调用的时候,如果锁被其他线程持有,那么tryLock会立即返回,返回结果为false,如果锁没有被

其他线程持有,那么当前调用线程会持有锁,并且tryLock返回的结果是true,

lock.lock();

try {

//do something

} finally {

lock.unlock();

}

3:volatile

保证了同一个变量在多线程中的可见性,所以它更多是用于修饰作为开关状态的变量,因为volatile保证了只有一份主存中的数据。

4:Atomics

public class Count {

private AtomicInteger counter = new AtomicInteger();

public int increase() {

return counter.incrementAndGet();

}

public int decrease() {

return counter.decrementAndGet();

}

}

AtomicInteger内部通过JNI的方式使用了硬件支持的CAS指令。

5:CountDownLatch

它是java.util.concurrent包中的一个类,它主要提供的机制是当多个(具体数量等于初始化CountDown时的count参数的值)线程都到达了预期状态

或完成预期工作时触发事件,其他线程可以等待这个事件来出发自己后续的工作,等待的线程可以是多个,即CountDownLatch是可以唤醒多个等待

的线程的,到达自己预期状态的线程会调用CountDownLatch的countDown方法,而等待的线程会调用CountDownLatch的await方法

6:CyclicBarrier

循环屏障,CyclicBarrier可以协同多个线程,让多个线程在这个屏障前等待,直到所有线程都到达了这个屏障时,再一起继续执行后面的动作。

CyclicBarrier和CountDownLatch都是用于多个线程间的协调的,二者的一个很大的差别是,CountDownLatch是在多个线程都进行了latch.countDown

后才会触发事件,唤醒await在latch上的线程,而执行countDown的线程,执行完countDown后,会继续自己线程的工作;

CyclicBarrier是一个栅栏,用于同步所有调用await方法的线程,并且等所有线程都到了await方法,这些线程才一起返回继续各自的工作,因为使用CyclicBarrier的线程都会阻塞在await方法上,所以在线程池中使用CyclicBarrier时要特别小心,如果线程池的线程 数过少,那么就会发生死锁了,

CyclicBarrier可以循环使用,CountDownLatch不能循环使用。

7:Semaphore

是用于管理信号量的,构造的时候传入可供管理的信号量的数值,信号量对量管理的信号就像令牌,构造时传入个数,总数就是控制并发的数量。

semaphore.acquire();

try {

//调用远程通信的方法

} finally () {

semaphore.release();

}

8:Exchanger

Exchanger,从名字上讲就是交换,它用于在两个线程之间进行数据交换,线程会阻塞在Exchanger的exchange方法上,直到另一个线程也到了

同一个Exchanger的exchange方法时,二者进行交换,然后两个线程会继续执行自身相关的代码。

9:Future和FutureTask

Future<HashMap> future = getDataFromRemote2();

//do something

HashMap data = (HashMap)future.get();

private Future<HashMap> getDateFromRemote2() {

return threadPool.submit(new Callable<HashMap>() {

public HashMap call() {

return getDataFromRemote();

}

});

}

思路:调用函数后马上返回,然后继续向下执行,急需要数据时再来用,或者说再来等待这个数据,具体实现方式有两种,一个是用Future,另一个

使用回调。

参考链接:https://blog.csdn.net/woshisap/article/details/43119569

最新文章

  1. Android Studio 恢复小窗口停靠模式(Docked Mode)
  2. linux笔记:关机重启命令shutdown,系统运行级别init,退出登录logout
  3. Linux之uboot分析与移植20160601
  4. 【设计模式 - 19】之观察者模式(Observer)
  5. ionic实战系列(一):ionic的开发环境配置和编译、发布
  6. Flink入门使用
  7. angularjs指令中的compile与link函数详解
  8. Three failed attempts of handling non-sequential data
  9. Elastic Stack之Redis集群使用
  10. kubernetes学习笔记之十二:资源指标API及自定义指标API
  11. SprirngBoot微服务之间的交互—— restTemplate
  12. Linux记录-普通用户下执行sudo xxx 找不到命令解决方案
  13. poi实现百万级数据导出
  14. ubuntu下gedit和vim输入中文和中文显示
  15. 136. Single Number (Bit)
  16. Unity3D中的弹道和移动目标提前量计算
  17. sqlserver top 赋值
  18. (五)Redis集合Set操作
  19. iOS自动化探索(三)WebDriverAgent Python Client
  20. HCNA实验OSPF基础

热门文章

  1. day29akka
  2. Java(命令行)打印库存清单
  3. apache常用配置文件讲解
  4. 永无BUG
  5. java BitSet2
  6. 阅读&lt;Video Timing Controller&gt;笔记
  7. java小程序(课堂作业02)
  8. MMU理解
  9. ubuntu 16.04 安装VS CODE时 此软件来自第三方且可能包含非自由组件
  10. SCOPE_IDENTITY的用法【转载】