Java并发编程
文章平均质量分 82
Java并发编程知识学习笔记
韦轩
软件工程
展开
-
Java并发编程-总结-21-33
二十一、死锁死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。这是一个严重的问题,因为死锁会让你的程序挂起无法完成任务。死锁的发生必须满足以下四个条件:互斥条件:一个资源每次只能被一个进程使用。请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:进程已获得的资源,在末使用完之前,不能强原创 2015-06-23 14:34:40 · 775 阅读 · 0 评论 -
Java并发编程-总结-11-20
十一、start()和run()的区别start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。public synchronized void start() { /** *原创 2015-06-22 23:13:18 · 706 阅读 · 0 评论 -
Java并发编程-总结-01-10
一、什么是并发?并发是一个程序同时执行多个计算的能力。这可以通过把计算分布在一个机器可用的CPU内核上或者甚至在同一网络上的不同的机器来实现。二、进程和线程的区别是什么?进程:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.线程:线程是进程的一个实体,是CPU调度和分派的基本单位进程与线程的区别:原创 2015-06-22 14:59:24 · 681 阅读 · 0 评论 -
Java并发编程-36-原子数组
一、同步机制存在的问题1、死锁2、即使只有一个线程访问这个对象,仍然需要执行必须的代码来获取和释放锁二、Compare-and-Swap-Operation1、取得变量值,即变量的旧值2、在一个临时变量中修改变量值,即变量的新值3、如果上面获得的变量旧值与当前变量值相等,就用新值替换旧值。如果已有其他线程修改了这个变量的值,上面获得的变量的旧值就可能与当前变量值原创 2015-06-21 17:37:33 · 719 阅读 · 0 评论 -
Java并发编程-35-原子变量-atomic
一、原子变量原子变量是Java 5 开始引入的,他提供了单个变量上的原子操作。当一个线程在对原子变量操作时,如果其他线程也试图对对同一原子变量执行操作,原子变量的实现类提供了一套机制来检查操作是否在一步内完成。这个操作下 获取变量值,然后在本地改变变量的值,然后试图用这个改变的值去替换之前的值。如果之前的值没有被其他线程改变,就可以执行这个替换操作。否则,方法将再执行这个操作。这种原创 2015-06-21 17:08:45 · 824 阅读 · 0 评论 -
Java并发编程-34-生成并发随机数-ThreadLocalRandom
一、ThreadLocalRandom这是一个线程本地变量,每个生成随机数的线程都有一个不同的生成器,但是都在同一个类中被管理。current()方法:这是一个静态方法,返回与当前线程关联的TaskLocalRandom对象,所以可以使用这个对象生成随机数 public static ThreadLocalRandom current() { if (原创 2015-06-21 11:19:44 · 4315 阅读 · 0 评论 -
Java并发编程-33-线程安全的可遍历映射
一、ConcurrentNavigableMap这个接口的类用一下两个部分存放元素一个键值,他是元素的唯一标识元素的其他部分数据二、ConcurrentSkipListMap这个类内部使用了Skip List来存放数据,Skip List是基于并发列表的数据结构,效率与二叉树相近参考这里三、测试package com.原创 2015-06-21 11:04:46 · 1554 阅读 · 0 评论 -
Java并发编程-32-带有延迟元素的队列-DelayQueue
一、DelayQueue可以存放带有激活日期的元素,当调用方法从队列中返回或提取元素时,未来日期的元素将被忽略package concurrencycollection;import java.util.Date;import java.util.concurrent.Delayed;import java.util.concurrent.TimeUnit;public原创 2015-06-21 00:23:21 · 2372 阅读 · 0 评论 -
Java并发编程-31-阻塞式优先级列表-PriorityBlockingQueue
一、PriorityBlockingQueue1、PriorityBlockingQueue里面的元素必须实现Comparable接口2、PriorityBlockingQueue,这个是阻塞式数据结构,当调用的方法不能立即执行时,调用这个方法的线程将被阻塞直到方法可以成功执行二、测试package concurrencycollection;pub原创 2015-06-20 21:49:00 · 747 阅读 · 0 评论 -
Java并发编程-30-阻塞式线程安全列表-LinkedBlockingDeque
一、LinkedBlockingDeque这是阻塞式列表:列表为空或者已满,操作不会被立即执行,而是将调用这个操作的线程阻塞到队列直到操作可以执行成功主要操作:public E take() throws InterruptedException { return takeFirst(); }从列表中取出字符串,如果列表为空,调用这个方法的线程可能会被阻原创 2015-06-20 20:41:14 · 3124 阅读 · 0 评论 -
Java并发编程-29-非阻塞式线程安全列表-ConcurrentLinkedDeque
一、ConcurrentLinkedDequepublic class ConcurrentLinkedDeque extends AbstractCollection implements Deque, java.io.Serializable提供的方法二、主要的方法public E pollFirst()public E pol原创 2015-06-20 12:14:14 · 2431 阅读 · 0 评论 -
Java并发编程-28-并发集合概述
一、基础概念1、同步和异步 ----描述的是通信模式同步:发送方发送请求后,需要等待接收方发回的响应后,才能发送下一个请求。所有的请求在服务器端得到同步,发送方和接收方对请求的处理步调是一致的异步:发送方发送请求后,不等待接收方响应这个请求,就继续发送下一个请求。所有来自发送方的请求形成一个队列,接收方处理完成后通知发送方2、阻塞和非阻塞 ---- 描述的是进程处理调用模式原创 2015-06-19 22:16:53 · 685 阅读 · 0 评论 -
Java并发编程-27-异常处理及取消任务
一、取消任务ForkJoinTask类提供的cancel()方法允许取消一个仍没有被执行的任务任务的取消对于已经发送到线程池的任务没有任何影响,他们将继续执行Fork/Join框架的局限性在于,ForkJoinPool线程池中的任务不允许被取消示例中:我们创建一个辅助类,它储存发送到线程池所有任务。可以用一个方法来取消存储的所有任务,如果任务已经执行或者结束,那么任务就不可能被原创 2015-06-18 21:49:10 · 1043 阅读 · 0 评论 -
Java并发编程-26-异步运行任务
一、异步运行任务在ForkJoinPool中执行ForkJoinTask时,可以采用同步或者异步的方式。同步:发送给Fork/Join线程池的方法知道任务执行完成后才会返回结果异步:发送给执行器的方法将立即返回结果,但是任务仍能够继续执行二、区别同步方式:比如invokeAll()方法,调用这些方法时,任务被挂起,直到任务被发送到Fork/Join线程池中执原创 2015-06-18 19:37:16 · 1376 阅读 · 0 评论 -
Java并发编程-25-合并任务的结果
一、合并任务的结果Fork/Join 框架提供了执行任务并返回结果的能力,这些类型的任务都是通过RecursiveTask类实现的RecursiveTask 类继承了ForkJoinTask类,并且实现了由执行器框架提供的Future接口二、get()方法get()方法是Future接口提供的,RecursiveTask类实现了这个接口,可以直接调用这个方法,返回Tas原创 2015-06-18 18:46:17 · 2004 阅读 · 0 评论 -
Java并发编程-24-创建Fork/Join线程池
一、使用Fork/Join的步骤1、创建用来执行任务的ForkJoinPool对象2、创建即将在线程池中被执行的任务ForkJoinTask子类/或者ForkJoinAction子类3、实现上述子类的compute方法,对任务的分解4、调用ForkJoinPool对象的execute()方法执行任务二、方法说明1、Fork/Join---invokeAl原创 2015-06-18 18:24:15 · 2019 阅读 · 0 评论 -
Java并发编程-23-Fork/Join 框架概述
一、Java 并发的总结1、通常,使用Java开发简单的并发应用程序时,会创建一些Runnable对象,然后创建对应的Thread对象来控制程序这些线程的创建,执行,以及线程的状态2、Java 5引入了Executor和ExecutorService接口以及实现这两个接口的的类,比如ThreadPoolExecutor之后,使得Java在并发上得到进一步的提升,执行器框架将任务的创建和原创 2015-06-17 23:00:35 · 908 阅读 · 0 评论 -
Java并发编程-22-处理在执行器中被拒绝的任务
一、被拒绝的任务1、当我们想结束执行器的执行时,调用shutDown()方法2、但是,执行器只有等待正在运行的任务或者等待执行任务结束之后,才能真正结束3、如果在执行器shutDown()之后,发送一个任务给执行器,这个任务会被拒绝二、RejectedExecutionHandler接口这个接口只有一个方法void rejectedExecuti原创 2015-06-17 21:40:55 · 2435 阅读 · 0 评论 -
Java并发编程-21-在执行器中分离任务的启动与结果的处理
一、在执行器中分离任务的启动与结果的处理1、通常情况下,使用线程执行器来执行并发任务,将runnable或callable任务发送给线程执行器,并获得Future对象来控制任务2、特殊情形:在一个对象里发送任务给执行器,然后在另一个对象里处理结果3、应运而生的CompletionService类二、CompletionService1、CompletionSer原创 2015-06-17 21:08:52 · 788 阅读 · 0 评论 -
Java并发编程-20-在执行器中取消任务和控制任务的完成
一、在执行器中取消任务使用执行器,不需要管理线程,只需要实现Runnable或Callable 任务,并发送任务给执行器即可执行器负责创建线程,管理线程池中的线程,当线程不再需要时就销毁它们有时,可能需要取消以发送给执行器的任务,可以使用Future的cancel()方法package com.concurrency.executor;import java.util.co原创 2015-06-17 18:18:04 · 1378 阅读 · 0 评论 -
Java并发编程-19-在执行器中延时执行任务和周期性执行任务
一、在执行器中延时执行任务1、使用ScheduledThreadPoolExecutor类2、schedule()方法 接收Callable对象或者Runnable对象 public ScheduledFuture schedule(Callable callable, long dela原创 2015-06-17 16:59:39 · 1875 阅读 · 0 评论 -
Java并发编程-18-在执行器中执行任务并处理结果
一、运行多个任务并处理第一个结果invokeAny()方法接受一个任务列表,然后运行任务,并返回第一个完成的任务并且没有抛出异常的任务的执行的结果1、两个任务都返回true值:invokeAny()返回首先完成任务的名称2、第一个任务返回true,第二个抛出异常,返回第一个任务执行的结果3、第一个任务抛出异常,第二个返回true,返回第二个任务执行的结果4、两个任务都抛出异原创 2015-06-17 15:53:01 · 735 阅读 · 0 评论 -
Java并发编程-17-在执行器中执行任务并返回结果
一、在执行器中执行任务并返回结果基于Callable接口和Future接口Callable接口:这个接口声明了Call方法,可以在这个方法里面实现任务的具体逻辑操作。这个接口是一个范型接口,这就意味着必须声明call()方法返回的数据类型Future接口:这个接口声明了一些方法来获取Callable对象产生的结果,并管理他们的状态Callable接口:@Function原创 2015-06-17 14:49:28 · 913 阅读 · 0 评论 -
Java并发编程-16-线程执行器-Executor Framework
一、Executor FrameWork核心是Executor接口及其子接口ExecutorService以及实现这两个接口的ThreadPoolExecutor类Executor接口---(注意是Executor接口)这个接口只有一个方法,他的参数是Runnable 对象void execute(Runnable command)ExecutorService原创 2015-06-17 13:04:10 · 825 阅读 · 0 评论 -
Java并发编程-15-并发任务间数据交换
一、并发阶段的数据交换Exchanger辅助类:允许在并发任务之间交换数据即:Exchanger类允许在两个线程之间定义同步点,当两个线程都到达同步点时,它们交换数据结构。二、生产者-消费者问题package com.weixuan.test;import java.util.List;import java.util.concurrent.Exchanger;p原创 2015-06-16 19:58:07 · 661 阅读 · 0 评论 -
Java并发编程-14-并发阶段任务的运行-Phaser
一、并发阶段任务的运行及切换作用:允许执行并发多阶段任务-----将一个并发任务分解成几步执行与其他辅助类不同的是:可以动态的增加或者减少任务数二、模拟使用phaser同步三个并发任务。这三个任务在三个不同的文件夹及子文件夹查找过去24小时内修改过苦熬站名为.log的文件步骤:1.在指定的文件夹及其子文件夹获得扩展名为.log的文件2.对第一步结果进行过滤:原创 2015-06-16 18:08:04 · 1031 阅读 · 0 评论 -
Java并发编程-13-在集合点的同步-CyclicBarrier
一、CyclicBarrier同步辅助类作用:允许两个或者多个线程在某个点上进行同步1、CyclicBarrier类使用一个整型数进行初始化,这个数是需要在某个点上同步的线程数2、当一个线程到达指定的点后,它将调用await()方法等待其他线程。当线程调用await()方法后,CyclicBarrier类将阻塞这个线程并使之休眠直到其他所有线程到达3、当最后一个线程调用Cycl原创 2015-06-16 16:02:55 · 732 阅读 · 0 评论 -
Java并发编程-12-等待多个并发事件的完成-CountDownLatch
一、等待多个事件的完成CountDownLatch1、CountDownLatch是一个同步辅助类。在完成一组其他线程中执行的操作之前,它允许线程一直等待2、这个类使用一个整数进行初始化,这个整数就是线程要等待完成的操作的数目3、当一个线程要等待某些操作先执行完时,需要调用await()方法,这个方法让线程进入休眠直到所有的操作都完成4、当一个操作完成的时候,调用countDo原创 2015-06-16 14:02:20 · 1388 阅读 · 0 评论 -
Java并发编程-11-线程同步辅助类-semaphore
一、更高级的同步机制信号量Semaphore:是一种计数器,用来保护一个或多个共享资源的访问。CountDownLatch:在完成一组正在其他线程中执行的操作之前,它允许线程一直等待CyclicBarrier:它允许多个线程在某个集合点处进行相互等待Phaser:可以把并发任务分成多个阶段运行,在进行下一阶段之前,当前阶段的所有线程都必须执行完成Exchanger:提供两个线程之间的数据交原创 2015-06-16 13:04:58 · 689 阅读 · 0 评论 -
Java并发编程-10-在锁中使用多条件-生产者消费者问题
一、在锁中使用条件一个锁可能关联一个或多个条件,这些条件通过Condition接口声明目的是允许线程获取锁并且查看等待的某一个条件是否满足,如果不满足就挂起直到某个线程唤醒它们二、模拟实现fileMock是一个文件模拟类Buffer是一个数据缓冲区一个或者多个生产者读取fileMock的所有数据行,并且使用insert()方法将读取的数据行插入到缓冲区原创 2015-06-16 11:16:10 · 1247 阅读 · 0 评论 -
Java并发编程-09-使用读写锁同步数据访问
一、ReadWriteLock接口1、可以看出,这个是java1.5添加的2、主要的实现类是ReentrantReadWriteLock3、主要的方法是readLock()和writeLock()二、测试代码package com.concurrent.threadSynchronize;import java.util.concurre原创 2015-06-15 23:58:19 · 927 阅读 · 0 评论 -
Java并发编程-08-使用锁实现同步
一、使用锁实现同步基于Lock接口及其实现类,Lock接口及其实现类如下:二、和synchronized相比1、支持更灵活的代码块结构使用synchronized关键字时,只能在同一个synchronized块结构中获取和释放控制,Lock允许控制的获取和释放不在同一个块结构中2、Lock接口功能更强大3、Lock允许分离读和写操作,允许多个读线原创 2015-06-15 22:53:16 · 991 阅读 · 0 评论 -
Java并发编程-07-在同步代码中使用条件--生产者-消费者问题
一、在同步代码中使用条件wait()notify()notifyAll()二、 wait()1、只能在同步代码块中调用2、当一个线程调用wait()方法事,jvm将这个线程置入休眠,并且释放控制这个同步代码快的对象,同时允许其他线程执行这个对象控制的其他同步代码快3、为了唤醒这个线程,必须在这个对象控制的某个同步代码快调用notify()方法或者noti原创 2015-06-14 21:12:12 · 648 阅读 · 0 评论 -
Java并发编程-06-Synchronize关键字同步机制
一、临界区 Critical Section临界区是一个用以访问共享资源的代码块,这个代码块在同一时间内只允许一个线程执行二、同步1、当一个线程试图访问一个临界资源时,它将使用一种同步机制来查看是不是已经有其他的线程进入临界区2、如果临界区没有其他线程,它就可以进入临界区。如果已经有线程进入临界区,它就被同步机制挂起,直到进入的线程离开这个临界区3、如果在等待进入临原创 2015-06-14 20:06:33 · 2676 阅读 · 0 评论 -
Java并发编程-05-使用ThreadFactory创建新线程
一、使用ThreadFactory的好处1、更容易修改类,或者改变对象的方式2、更容易为有限资源限制创建对象的数目3、更容易为创建的对象生成统计工具二、ThreadFactory接口//这个接口只有一个方法 public interface ThreadFactory { /** * Constructs a new {@code Thread}. Im原创 2015-06-14 13:03:14 · 2439 阅读 · 0 评论 -
Java并发编程-04-线程局部变量
一、线程局部变量1、如果一个变量是成员变量,那么多个线程对同一个对象的成员变量进行操作时,它们对该成员变量是彼此影响的,也就是说一个线程对成员变量的改变会影响到另一个线程。2、在某种情况下,对象的属性不需要被所有线程共享。可以采用 Java api 提供的一个干净的机制-----线程局部变量 3、如果一个变量是局部变量,那么每个线程都会有一个该局部变量的拷贝(即便是同一个对象中的方原创 2015-06-14 12:06:24 · 1022 阅读 · 0 评论 -
Java并发编程-03-守护线程的创建和运行
一、守护线程1、守护线程的优先级很低2、当一个应用程序里没有其他线程运行的时候,守护线程才运行。3、当守护线程是唯一运行的线程时,守护线程运行结束后,JVM也就结束了这个程序4、守护线程被用来作为同一程序中普通线程(也称为用户线程)的服务提供者。5、守护线程通常是无线循环的,以等待服务请求或者执行线程的任务。6、我们无法知道守护线程什么时候可以获取cpu的时钟7、在原创 2015-06-12 17:48:21 · 771 阅读 · 0 评论 -
Java并发编程-02-线程的中断,休眠和等待线程的终止
一、线程的中断1、检查线程中断的函数isInterrupted()和thread类的静态方法Thread.interrupted()2、中断线程的函数interrupt(),内部实现也是基于jni实现的二、线程的休眠1、sleep()方法public static native void sleep(long millis) throws原创 2015-06-11 19:33:45 · 1379 阅读 · 0 评论 -
Java并发编程-01-线程的创建和线程信息获取
一、创建线程的方式1、继承Thread类,覆盖run方法2、实现Runnable接口,创建Thread类的实例,通过构造方法实现3、Runnable接口只有一个抽象的run方法,也就是说Runnable接口本身不支持多线程public interface Runnable { /** * When an object implementing interf原创 2015-06-10 20:02:52 · 1195 阅读 · 0 评论