JDK并发包二】的更多相关文章

JDK并发包二 线程复用--线程池 在线程池中,总有那么几个活跃的线程,当程序需要线程时可以从池子中随便拿一个控线程,当程序执行完毕,线程不关闭,而是将这个线程退会到池子,等待使用. JDK提供了一套Executor框架,可以有效进行线程控制.ThreadPoolExecutor表示一个线程池,Executors类相当与线程池工厂,通过Executors可以获得一个拥有特定功能的线程池. Executors框架提供了各类线程池,主要有下面工厂方法 public static ExecutorSe…
一,JDK并发包实际上就是指java.util.concurrent包里面的那些类和接口等 主要分为以下几类: 1,原子量:2,并发集合:3,同步器:4,可重入锁:5,线程池 二,原子量 原子变量主要有AtomicInteger,AtomicLong,AtomicBoolean等, 主要实现原理都是底层实现类CAS 即比较并交换,都有get,set,compareAndSet等方法,如++,--等也都是有自带方法实现 这些都是线程安全的,保证了多线程访问时候的可见性 import java.ut…
JDK并发包之同步控制 一.重入锁 重入锁使用java.util.concurrent.locks.ReentrantLock来实现.示例代码如下: public class TryReentrantLock implements Runnable{ static ReentrantLock lock=new ReentrantLock(); static int i=0; @Override public void run() { for(int j=0;j<10000;j++){ lock.…
Java多线程--JDK并发包(2) 线程池 在使用线程池后,创建线程变成了从线程池里获得空闲线程,关闭线程变成了将线程归坏给线程池. JDK有一套Executor框架,大概包括Executor.ExecutorService.AbstractExeccutorService.ThreadPoolExecutor.Executors等成员,位于java.util.concurrent包下.它们之间的关系如下: Executor是顶层的接口,ExecutorService接口继承了它,Abstrc…
Java多线程--JDK并发包(1) 之前介绍了synchronized关键字,它决定了额一个线程是否可以进入临界区:还有Object类的wait()和notify()方法,起到线程等待和唤醒作用.synchronized关键字经常和它们一起使用,因为wait和notify在调用之前需要获得"锁",而锁时依靠synchronized获得的. 同步机制 重入锁 下面是一个使用ReentrantLock的简单例子.可以看到,和synchronized相比,必须手动调用unlock()方法释…
JDK内部提供了大量实用的API和框架.本章主要介绍这些JDK内部功能,主要分为3大部分: 首先,介绍有关同步控制的工具,之前介绍的synchronized就是一种同步控制手段,将介绍更加丰富的多线程控制方法. 其次,将详细介绍JDK对线程池的支持,使用线程池,将很大程度提高线程调度的性能. 第三,介绍JDK的一些并发容器.这些容器专为并行访问所设计,绝对是高效.安全.稳定的实用工具. 多线程团队协作:同步控制 之前提到的synchronized是最简单的同步控制的方法.本节中,首先介绍sync…
3.2 线程复用:线程池 一种最为简单的线程创建和回收的方法类似如下代码: new Thread(new Runnable() { @Override public void run() { // do sth. } }).start(); 在run方法结束后,自动回收. 在真实的生产环境中,系统由于真实环境的需要,可能会开启很多线程来支撑其应用.而当线程数量过大时,反而会耗尽CPU和内存资源. 3.2.1 什么是线程池 为了避免系统频繁地创建和销毁线程,我们可以让创建的线程进行复用. 在使用线…
JDK并发包一 同步控制是并发程序必不可少的重要手段,synchronized是一种最简单的控制方法.但JDK提供了更加强大的方法----重入锁 重入锁 重入锁使用java.util.concurrent.locks.ReentrantLock类来实现. ReentrantLock有几个重要的方法 lock()获得锁,如果锁已占用,则等待. lockInterruptibly()获得锁,优先响应中断. tryLock() 尝试获得锁若成功返回true 失败返回false 不等待立即返回 tryL…
3.1.2 重入锁的好搭档:Condition条件 它和wait()和notify()方法的作用是大致相同的.但是wait()和notify()方法是和synchronized关键字合作使用的,而Condition是与重入锁相关联的.通过Lock接口的Condition newCondition()方法可以生成一个与当前重入锁绑定的Condition实例.利用Condition对象,我们就可以让线程在合适的时间等待,或者在某一种特定的时刻得到通知,继续执行. Condition接口提供的基本方法…
线程复用:线程池 一.为什么需要线程池 为了避免系统频繁地创建和销毁线程,使用线程池让线程进行复用.(即创建线程变成了从线程池中获取空闲线程,销毁线程变成了把线程放回线程池中.) 二.JDK对线程池的支持:Executor框架 一)Excutor框架简介 public static ExecutorService newFixedThreadPool(int Threads) //返回一个固定线程数量的线程池,当新任务提交时无空闲线程,则任务进入等待队列,等待空闲线程. public stati…
转自:https://blog.csdn.net/dataiyangu/article/details/86573222 1. 线程池的基本使用1.1. 为什么需要线程池1.2. JDK为我们提供了哪些支持 内置线程池1.2.1.1.3. 线程池的使用1.3.1. 线程池的种类1.3.2. 不同线程池的共同性 线程池构造函数详解1.4. 线程池使用的小例子1.4.1. 简单线程池1.4.2. ScheduledThreadPool2. 扩展和增强线程池2.1. 回调接口2.2. 拒绝策略拒绝策略…
3.3 不要重复发明轮子:JDK的并发容器 3.3.1 超好用的工具类:并发集合简介 JDK提供的这些容器大部分在java.util.concurrent包中. ConcurrentHashMap:这是一个高效的并发HashMap.可以理解为一个线程安全的HashMap. CopyOnWriteArrayList:这是一个List,从名字看就是和ArrayList是一族的.在读多写少的场合,这个List的性能非常好,远远好于Vector. ConcurrentLinkedQueue:高效的并发队…
转载地址:http://blog.csdn.net/yangbutao/article/details/8479520 1.java 高并发包所采用的几个机制(CAS,volatile,抽象队列同步) CAS(乐观操作),jdk5以前采用synchronized,对共享区域进行同步操作,synchronized是重的操作,在高并发情况下,会引起线程频繁切换:而CAS是一种乐观锁机制,compare and swap,不加锁,而是假设没有冲突去完成,若有冲突会重试(非阻塞).compare&swa…
JDK5之后引进了并发包java.util.concurrent,让并发的开发更加可控,更加简单.所以有必要好好学习下,下面从同步控制.并发容器.线程池三部分来详细了解它. 1. 各种同步控制工具的使用 1.1 ReentrantLock(重用锁) 1)与synchronized的区别是,它需要手动申请锁与解锁,在 finally 块中释放锁,而synchronized是JVM自动处理的.可控性上ReentrantLock更强. 由于ReentrantLock是重入锁,所以可以反复得到相同的一把…
并发包需要注意的知识点 集合类的体系结构…
接上一篇文章深挖JDK动态代理(一)我们来分析一下JDK生成动态的代理类究竟是个什么东西 1. 将生成的代理类编程一个class文件,通过以下方法 public static void transClass() throws IOException { URL resource = rpcMain.class.getClass().getResource("/"); byte[] bts = ProxyGenerator.generateProxyClass("$Proxy0…
本文主要介绍jdk中常用的同步控制工具以及并发容器, 其结构如下: 同步控制工具类 ReentrantLock 简而言之, 就是自由度更高的synchronized, 主要具备以下优点. 可重入: 单线程可以重复进入,但要重复退出 可中断: lock.lockInterruptibly() 可限时: 超时不能获得锁,就返回false,不会永久等待构成死锁 公平锁: 先来先得, public ReentrantLock(boolean fair), 默认锁不公平的, 根据线程优先级竞争. 示例 …
相信大家都知道,jdk中ExecutorService是并发编程时使用很频繁的接口,并且使用很方便,那么想在有这么一个场景: 一批任务使用线程池处理,并且需要获得结果,但是不关心任务执行结束后输出结果的先后顺序,应该如何实现?大多数人可能会想到,将任务作为一个Callable,然后调用submit塞入ExecutorService中,返回Future,然后遍历Future,依次获得结果不就行了吗? 那么,大家是否想过,这样有两个不好的点:1.调用submit后需要将Future存储:2.遍历Fu…
CopyOnWriteArrayList是jdk1.5并法包里面用于处理高并发下.读多写少的情况下.减少锁等待的集合类.以下对该类实现做一个简要的分析 1,首先CopyOnWriteArrayList是实现了List接口,对=List接口的相关方法进行了实现. 2,以下的它的add方法,会首先加锁,然后copy原List内部的数组,然后对新数组长度加1后释放锁.因为数组copy速度非常快,切在读多写少的情况下锁开销比較少 public boolean add(E e) { final Reent…
这一节来讲一讲java.util.concurrent这个包里的一些重要的线程安全有关类. synchronized容器 synchronized容器就是把自己的内部状态封装起来,通过把每一个public方法设置成同步来控制对共享变量的访问的容器.主要包括Vector, Hashtable,以及Collections.synchronizedxxx()方法提供的wrapper. synchronized容器的问题-client locking 首先,synchronzied容器虽然是线程安全的,…
1. java.util.concurrent概述 JDK5.0以后的版本都引入了高级并发特性,大多数的特性在java.util.concurrent包中,是专门用于多线并发编程的,充分利用了现代多处理器和多核心系统的功能以编写大规模并发应用程序.主要包含原子量.并发集合.同步器.可重入锁,并对线程池的构造提供了强力的支持. 原子量,是定义了支持对单一变量执行原子操作的类.所有类都有get和set方法,工作方法和对volatile变量的读取和写入一样. 并发集合,是原有集合框架的补充,为多线程并…
转自:https://blog.csdn.net/dataiyangu/article/details/86491786#2__696 1. 各种同步控制工具的使用1.1. ReentrantLock1.1.1.可重入1.1.2. 可中断 lockInterruptibly()1.1.3. 可限时1.1.4. 公平锁1.2. Condition1.2.1. 概述1.2.2. 主要接口1.2.3. API详解1.3. Semaphore1.3.1. 概述1.3.2. 主要接口1.4. ReadWr…
3.2.5 自定义线程创建:ThreadFactory 线程池的主要作用是为了线程复用,也就是避免了线程的频繁创建. ThreadFactory是一个接口,它只有一个方法,用来创建线程: Thread newThread(Runnable r); 当线程池需要新建线程时,就会调用这个方法. 下面的案例使用自定义的ThreadFactory,一方面记录了线程的创建,另一方面将所有的线程都设置为守护线程,这样,当主线程退出后,将会强制销毁线程池. public static void main(St…
3.1 多线程的团队协作:同步控制 3.1.1 synchronized的功能扩展:重入锁 重入锁可以完全替代synchronized关键字. 重入锁使用java.util.concurrent.locks.ReentrantLock类来实现.下面是一段最简单的重入锁使用案例: public class ReenterLock implements Runnable { public static ReentrantLock lock = new ReentrantLock(); public…
OA项目环境搭建 一个项目想要能够在开发人员打包好项目包之后进行测试,就必须进行项目测试环境的搭建,要根据开发工程师的开发环境采用不同的测试环境,以下只是浅谈下Java项目OA(办公自动化平台)的环境搭建,如有错误,欢迎指正. 一.    JDK的安装与验证 二.    tomcat的安装与验证 三.    MySQL的安装与验证 四.    项目部署配置与验证 在搭建环境前要确认所需安装包是否齐全,各个版本是否兼容,电脑系统环境是否安全,如果确认无误,下面进行安装 一.    JDK的安装与验…
转载自:https://my.oschina.net/hosee/blog/614319: 摘要: 本系列基于炼数成金课程,为了更好的学习,做了系列的记录. 本文主要介绍: 1. 线程池的基本使用 2. 扩展和增强线程池 3. ForkJoin 1. 线程池的基本使用 1.1.为什么需要线程池 平时的业务中,如果要使用多线程,那么我们会在业务开始前创建线程,业务结束后,销毁线程.但是对于业务来说,线程的创建和销毁是与业务本身无关的,只关心线程所执行的任务.因此希望把尽可能多的cpu用在执行任务上…
一,需要软件: jdk 和eclipse 二,JDK和eclipse的下载 JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 进入页面:选择合适的版本->downloads->接受协议(否则无法下载)->选择JDK的版本(系统,和位数) eclipse下载地址:https://www.eclipse.org/downloads/ 进入页面后:选择你需要的版…
•配置JDK环境变量<Windows系统下> 点击我的电脑右键----->属性------>高级------>环境变量------->  新建(建议在系统变量中新建) 一.变量名:JAVA_HOME 变量值:JDK安装目录 二.变量名:CLASSPATH 变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar 三.变量名:Path(系统自带,不必新建) 变量值: %JAVA_HOME%\bin; 注意:Path变量值…
在谈论到反射这个问题时,你是否有例如以下疑问? 不管是在.NET还是Java中反射的原理和机制是一样的,理解了一种还有一种就能够迎刃而解,想要理解反射首先须要了解底层的一些概念和执行.理解了反射有助于你理解程序的执行原理,眼下非常多框架(java..NET)中都引入了反射这一个技术,反射事实上也不是什么新的技术仅仅是几个不同的操作过程集成到一起关联起来了. 从表面上我们看到的效果是这种:通过传入一个字符串能够得到某个类的对象,在这一个过程中做了非常多事情.你是否有以下的一些疑问存在?      …