个人感觉,看书学习还是需要“不求甚解”,因为一旦太过于计较小的得失,就容易钻牛角尖,学习进度也慢.我们完全可以先学一个大概,等到真正用到的时候再把那些细节丰富起来,就更有针对性. 所以,针对java并发核心的东西,我感觉就是一些api的调用,不需要面面俱到,只要知道每个类实现什么,如何调用就行. 1.CountDownLatch:  java.util.concurrent.CountDownLatch CountDownLatch作用:同步功能的辅助类,初始化时传入一个int类型的count值…
最近在看一本书<Java并发编程 核心方法与框架>,打算一边学习一边把学习的经验记下来,所粘贴的代码都是我运行过的,大家一起学习,欢迎吐槽. 估计也没多少人看我的博客,哈哈,那么我还是会记下来,天空不曾留下我的痕迹,但我已飞过,而在博客园留下了我的痕迹~ 1.Semaphore的初步使用 Semaphore是什么,能做什么? Semaphore 是 synchronized 的加强版,作用是控制线程的并发数量.就这一点而言,单纯的synchronized 关键字是实现不了的. 直接看例子吧,这…
继续并发方面的知识.今天介绍Semaphore,同样在java.util.concurrent包下. 本来准备通过例子,从自己实现到最后使用并发工具实现,但是貌似效果并不是很好,有点太啰嗦的感觉,所有准备直入主题. 介绍:Semaphore中管理着一组虚拟的许可,许可的初始数量可通过构造函数来指定[new Semaphore(1);],执行操作时可以首先获得许可[semaphore.acquire();],并在使用后释放许可[semaphore.release();].如果没有许可,那么acqu…
1.介绍 Semaphore 中文的含义 信号,信号系统,此类的只要作用就是限制线程的并发的数量. Semaphore内部主要通过AQS(AbstractQueuedSynchronizer)实现线程的管理.Semaphore有两个构造函数,参数permits表示许可数,它最后传递给了AQS的state值.线程在运行时首先acquire(获取)许可,如果成功,许可数就减1,线程运行,当线程运行结束就release(释放)许可,许可数就加1.如果许可数为0,则获取失败,线程位于AQS的等待队列中,…
分类: Java技术      锁和信号量(Semaphore)是实现多线程同步的两种常用的手段.信号量需要初始化一个许可值,许可值可以大于0,也可以小于0,也可以等于0.      如果大于0,表示,还有许可证可以发放,线程不会被阻塞:      如果小于或者等于0,表示,没有许可证可以发放了,线程被阻塞住了.      它有两个常用的操作,acquire()申请许可证,如果有,就可以获得,如果没有就等待了.                          release(),归还许可证,保…
package com.thread.test.thread; import java.util.Random; import java.util.concurrent.*; /** * Semaphore * Semaphore维护者一组权限,无实体权限,只是一组代表权限的数字, * 每一次执行acquire都会被阻塞,直到获取获取权限, * 每一次执行release都会释放权限,唤醒阻塞acquire线程 * * Semaphore通常应用于限制资源访问 * * * Created by w…
首先我们来实现一个功能:当我们启动一个系统的时候需要初始化许多数据,这时候我们可能需要启动很多线程来进行数据的初始化,只有这些系统初始化结束之后才能够启动系统.其实在Java的类库中已经提供了Semaphore.CountDownLatch.CyclicBarrier这3个类来帮我们实现这样类似的功能了. 一.信号灯 Semaphore Semaphore sp = new Semaphore(int permits) 接受一个整数型的参数,表示有几盏灯.线程可以通过semaphore.acqu…
Semaphore(信号量)是JUC包中比较常用到的一个类,它是AQS共享模式的一个应用,可以允许多个线程同时对共享资源进行操作,并且可以有效的控制并发数,利用它可以很好的实现流量控制.Semaphore提供了一个许可证的概念,可以把这个许可证看作公共汽车车票,只有成功获取车票的人才能够上车,并且车票是有一定数量的,不可能毫无限制的发下去,这样就会导致公交车超载.所以当车票发完的时候(公交车以满载),其他人就只能等下一趟车了.如果中途有人下车,那么他的位置将会空闲出来,因此如果这时其他人想要上车…
1.List接口:ArrayList 和 Vector ArrayList不是线程安全的,Vector是线程安全的,Vector有一个子类,可实现后进先出(LIFO)的对象堆栈(LinkedList 也是List接口的实现类). 2.Set接口:HashSet 和 TreeSet Set接口最常见的实现类是HashSet,HashSet默认是以无序的方式组织元素的,而LinkedHashSet可以有序组织元素: Treeset不仅实现了Set接口,还实现了SortedSet和NavigableS…
jdk1.7中提供了Fork/Join并行执行任务框架,主要作用就是把大任务分割成若干个小任务,再对每个小任务得到的结果进行汇总. 正常情况下,一些小任务我们可以使用单线程递归来实现,但是如果要想充分利用CPU资源,就需要把一个任务分成若干个小任务,并行执行了,这就是分治编程. 在JDK中,并行执行框架Fork-Join使用了“工作窃取(work-stealing)”算法. JDK1.7中实现分治编程思路: 使用 ForkJoinPool 类提供了一个任务池. 具体执行任务需要靠 ForkJoi…
Java中定时任务Timer工具类提供了计划任务的实现,但是Timer工具类是以队列的方式来管理线程的,并不是以线程池的方式,这样在高并发的情况下,运行效率会有点低. ScheduleExecutorService 主要作用是将定时任务与线程池结合使用. ScheduleExecutorService 的父接口是Executor,父类是ThreadPoolExecutor. 看个例子 final SimpleDateFormat sf = new SimpleDateFormat("yyyy-M…
信号量(Semaphore).有时被称为信号灯.是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们可以正确.合理的使用公共资源. 一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要.在许可可用前会堵塞每个 acquire(),然后再获取该许可.每个 release() 加入一个许可.从而可能释放一个正在堵塞的获取者. 可是.不使用实际的许可对象,Semaphore 仅仅对可用许可的号码进行计数,并採取对应的行动.拿到信号量的线程能够进入代码.否则就等待.通过acquir…
什么是Semaphore Semaphore可以控制某个资源可被同时访问的个数(locks和synchronized锁,在任何时刻只允许一个任务访问一个资源),通过acquire()获取一个许可,如果没有则等待,release()释放一个许可.可以将Semaphore看成分发许可证,只有分到许可的线程才能访问线程,访问资源完毕后需要返还许可,以便让等待的线程获取许可访问资源. Semaphore有两个构造函数,Semaphore(int)和Semaphore(int,boolean).参数中的i…
Executor 和 ThreadPoolExecutor 实现的是线程池,主要作用是支持高并发的访问处理. Executor 是一个接口,与线程池有关的大部分类都实现了此接口. ExecutorService 是 Executor 的子接口:AbstractExecutorService 是 ExecutorService 的实现类,但是是抽象类. ThreadPoolExecutor 是 AbstractExecutorService 的子类,可实例化. Executors 是一个工厂类,用…
类 Exchanger 的功能可以使2个线程之间传输数据,比生产者/消费者模式方便. Exchanger类的结构很简单,重点就是exchange()方法. exchange()方法是阻塞执行的,可以设置超时时间,调用不同的api即可. exchange 的 英文意思就是交换,而对于线程而言也是这样的,就是两个线程交换信息.如果共有3个线程,且3个线程同时调用了exchange,那么就会有一个线程没有交换信息的对象,就会继续阻塞. 下面是一个例子: 共有两个类 ExchangerThread.Ex…
CompletionService 接口的功能是以异步的方式一边生产新的任务,一边处理已完成任务的结果,这样就可以将执行任务与处理任务分离开. CompletionService 仅有一个实现类 ExecutorCompletionService,需要依赖Executor对象,其大部分实现是使用线程池 ThreadPoolExecutor实现的. 构造方法有两个 // Linkedblockingqueue作为任务完成队列 ExecutorCompletionService(Executor e…
默认情况下,线程Thread对象不具有返回值的功能,如果在需要取得返回值的情况下会极为不方便.jdk1.5中可以使用Future 和 Callable 来获取线程返回值. Callable 可以 看成与 Runnable 一样的但是有返回值的接口. Callable接口的call()方法有返回值,而Runnable接口的run方法没有返回值: Callable接口的call()方法可以声明抛出异常,而Runnable接口的run方法不可以声明抛出异常. 执行完Callable接口中的任务后,返回…
目录   一.J.U.C 简介  二.synchronized  三.volatile  四.CAS  五.ThreadLocal  参考资料…
我在<JDK1.5引入的concurrent包>中,曾经介绍过CountDownLatch.CyclicBarrier两个类,还给出了CountDownLatch的演示案例.这里再系统总结下Java并发编程中的4个类CountDownLatch.CyclicBarrier.Semaphore.Phaser. 1.CountDownLatch CountDownLatch可以理解为一个计数器在初始化时设置初始值,当一个线程需要等待某些操作先完成时,需要调用await()方法.这个方法让线程进入休…
引言 最近可以进行个税申报了,还没有申报的同学可以赶紧去试试哦.不过我反正是从上午到下午一直都没有成功的进行申报,一进行申报 就返回"当前访问人数过多,请稍后再试".为什么有些人就能够申报成功,有些人就直接返回失败.这很明显申报处理资源是有限的, 只能等别人处理完了在来处理你的,你如果运气好可能重试几次就轮到你了,如果运气不好可能重试一天也可能轮不到你. 我反正已经是放弃了,等到夜深人静的时候再来试试.作为一个程序员我们肯定知道这是个税申请app的限流操作,如果还有不懂什么 是限流操作…
信号量Semaphore是一个控制访问多个共享资源的计数器,它本质上是一个"共享锁". Java并发提供了两种加锁模式:共享锁和独占锁.前面LZ介绍的ReentrantLock就是独占锁.对于独占锁而言,它每次只能有一个线程持有,而共享锁则不同,它允许多个线程并行持有锁,并发访问共享资源. 独占锁它所采用的是一种悲观的加锁策略,  对于写而言为了避免冲突独占是必须的,但是对于读就没有必要了,因为它不会影响数据的一致性.如果某个只读线程获取独占锁,则其他读线程都只能等待了,这种情况下就限…
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法. 以下是本文目录大纲: 一.CountDownLatch用法 二.CyclicBarrier用法 三.Semaphore用法 若有不正之处请多多谅解,并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接:…
信号量 信号量类Semaphore,用来保护对唯一共享资源的访问.一个简单的打印队列,并发任务进行打印,加入信号量同时之能有一个线程进行打印任务 . import java.util.concurrent.Semaphore; public class PrintQueue { public PrintQueue() { semaphore = new Semaphore(1,true); } private final Semaphore semaphore; public void prin…
作用 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 简介 Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数,并提供了同步机制.使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数. 主要方法摘要: void acquire():从此信号量获取一个许可,在提供一个许可前翼子将线程阻塞,否则线程被中断. void release():释放一个许可,将其返回给信号量. in…
先做总结: 1.Semaphore是什么? Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 把它比作是控制流量的红绿灯,比如XX马路要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须在路口等待,所以前一百辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶入XX马路,但是如果前一百辆中有五辆车已经离开了XX马路,那么后面就允许有5辆车驶入马路,这个例子里说的车就是线程,驶入马路就表示线程在执行,离开马路就表示线程…
1. 倒计时器CountDownLatch 在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread类的join方法,让主线程等待被join的线程执行完之后,主线程才能继续往下执行.当然,使用线程间消息通信机制也可以完成.其实,java并发工具类中为我们提供了类似“倒计时”这样的工具类,可以十分方便的完成所说的这种业务场景. 为了能够理解CountDownLatch,举一个很通俗的例子,运动员进行跑步比赛时,…
下面对上面说的三个辅助类进行一个总结: 1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同: CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行: 而CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行: 另外,CountDownLatch是不能够重用的,而CyclicBarrier是可以重用的. 2)Semaphore其实和锁有点类似,它一般用于控制对某组资源的访问权…
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法. 以下是本文目录大纲: 一.CountDownLatch用法 二.CyclicBarrier用法 三.Semaphore用法 若有不正之处请多多谅解,并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接:…
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore   Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法. 以下是本文目录大纲: 一.CountDownLatch用法 二.CyclicBarrier用法 三.Sema…
并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能.它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰.思维缜密,这样才能写出高效.安全.可靠的多线程并发程序.本系列会从线程间协调的方式(wait.notify.notifyAll).Synchronized及Volatile的本质入手,详细解释JDK为我们提供的每种并发工具和底层实现机制.在此基础上,我们会进一步分析java.util.concurrent包的工具类,包括其使用方式.实现源码及其背后的原理.本…