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

Java中涉及线程和并发相关的内容相关推荐

  1. 【多线程和并发】Java中的线程池的实现原理

    Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行的程序都可以使用线程池. 合理使用线程池能带来三个好处: 降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗: 提 ...

  2. java中创建线程的四种方式及线程池详解

    众所周知,我们在创建线程时有四种方法可以用,分别是: 1.继承Thread类创建线程 2.实现Runnable接口创建线程 3.使用Callable和Future创建线程 4.使用线程池创建(使用ja ...

  3. 万字图文 | 学会Java中的线程池,这一篇也许就够了!

    来源:一枝花算不算浪漫 线程池原理思维导图.png 前言 Java中的线程池已经不是什么神秘的技术了,相信在看的读者在项目中也都有使用过.关于线程池的文章也是数不胜数,我们站在巨人的肩膀上来再次梳理一 ...

  4. java线程和内核线程的,Java中内核线程理论及实例详解

    1.概念 内核线程是直接由操作系统内核控制的,内核通过调度器来完成内核线程的调度并负责将其映射到处理器上执行.内核态下的线程执行速度理论上是最高的,但是用户不会直接操作内核线程,而是通过内核线程的接口 ...

  5. Java中的线程基础知识

    Java中的线程基础知识 1.线程概念 线程是程序运行的基本执行单元.当操作系统(不包括单线程的操作系统,如微软早期的DOS)在执行一个程序时,会在系统中建立一个进程,而在这个进程中,必须至少建立一个 ...

  6. 不允许使用java方式启动_细品 Java 中启动线程的正确和错误方式

    细品 Java 中启动线程的正确和错误方式 前文回顾详细分析 Java 中实现多线程的方法有几种?(从本质上出发) start 方法和 run 方法的比较 代码演示:/** * * start() 和 ...

  7. 如何在java中实现线程_用代码说话:如何在Java中实现线程

    并发编程是Java语言的重要特性之一,"如何在Java中实现线程"是学习并发编程的入门知识,也是Java工程师面试必备的基础知识.本文从线程说起,然后用代码说明如何在Java中实现 ...

  8. Java多线程编程(1)--Java中的线程

    一.程序.进程和线程   程序是一组指令的有序集合,也可以将其通俗地理解为若干行代码.它本身没有任何运行的含义,它只是一个静态的实体,它可能只是一个单纯的文本文件,也有可能是经过编译之后生成的可执行文 ...

  9. JAVA中创建线程池的五种方法及比较

    之前写过JAVA中创建线程的三种方法及比较.这次来说说线程池. JAVA中创建线程池主要有两类方法,一类是通过Executors工厂类提供的方法,该类提供了4种不同的线程池可供使用.另一类是通过Thr ...

  10. 青铜2:本来面目-如何认识Java中的线程

    在前面的<兵分三路:如何创建多线程>文章中,我们已经通过Thread和Runnable直观地了解如何在Java中创建一个线程,相信你已经有了一定的体感.在本篇文章中,我们将基于前面的示例代 ...

最新文章

  1. 轻松入门模型转换和可视化
  2. php 正则表达式 取所有内容,php正则表达式获取内容所有链接
  3. 关于cgroup的几个核心名词及其关系
  4. 如何使用Python玩转PDF各种骚操作?
  5. GET_ROLE_BASED_PAGE_USAGES
  6. centos6.4 源码安装mysql5.5
  7. cad在线转换_CAD转PDF批量转换怎么转?教你一次性操作,一看就会
  8. 卖出总数的一半又少8个_(完整版)第九讲还原问题(三年级奥数)
  9. 《App后台开发运维和架构实践》推荐序
  10. mpush部署实现与测试
  11. 计算机打印怎么取消,打印机如何取消打印作业?如何删除打印作业?
  12. linux gz he xz,gz与xz两种压缩格式的对比
  13. 网站首页的轮播新闻flash效果实现
  14. WindowsWord 常用快捷键
  15. Android极光推送jPush混淆时出错的解决方案 Stack size becomes negative after instruction [247] swap in [cn/jiguang/s
  16. 超算计算机需要显卡吗,NVIDIA:中国超算性能世界第一认了 但省电我最强
  17. 关于Error: EPERM: operation not permitted, mkdir...几种解决办法的比较
  18. 小米10S MIUI13.0.3线刷12.5.14
  19. 关于String你了解多少
  20. 生产者和消费者问题(单一生产者和单一消费者)

热门文章

  1. NumPy库---文件操作
  2. mysql语句解析_MYSQL中SQL执行分析
  3. java运行matlab代码
  4. 第二章随机过程的基本知识part I
  5. UVAOJ1586题解
  6. Spring Cloud学习笔记---雪崩来啦有豪猪
  7. 使用boost中的线程池
  8. SVM --从“原理”到实现
  9. vofuria的开发(5)替换原vuforia的茶壶模型、改为自己想要的模型AR model
  10. h3c交换机查看电源和风扇模块序列号