随笔分类 -  03.Java并发编程

摘要:ExecutorService是JDK并发工具包提供的一个核心接口,相当于一个线程池,提供执行任务和管理生命周期的方法。ExecutorService接口中的大部分API都是比较容易上手使用的,本文主要介绍下invokeAll和invokeAll方法的特性和使用。 这是一个通过睡眠来模拟的耗时任务, 阅读全文
posted @ 2016-08-31 22:43 moonandstar08 阅读(1130) 评论(0) 推荐(0) 编辑
摘要:总的来说,当动态加载一个资源时,至少有三种类加载器可供选择: 系统类加载器(也被称为应用类加载器)(system classloader) 当前类加载器(current classloader) 当前线程的上下文类加载器( the current thread context classloader 阅读全文
posted @ 2016-08-24 22:17 moonandstar08 阅读(375) 评论(0) 推荐(0) 编辑
摘要:一、线程池的处理流程 向线程池提交一个任务后,它的主要处理流程如下图所示: 一个线程从被提交(submit)到执行共经历以下流程: 线程池判断核心线程池里的线程是否都在执行任务,如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下一个流程; 线程池判断工作队列是否 阅读全文
posted @ 2016-06-23 22:42 moonandstar08 阅读(621) 评论(0) 推荐(0) 编辑
摘要:JUC 并发编程全景图如下: 阅读全文
posted @ 2016-05-04 22:37 moonandstar08 阅读(293) 评论(0) 推荐(0) 编辑
摘要:关于volatile变量的使用,由于使用得比较多,后面如果需要温习的话可以参考:http://www.infoq.com/cn/articles/java-memory-model-4 阅读全文
posted @ 2016-04-28 21:50 moonandstar08 阅读(217) 评论(0) 推荐(0) 编辑
摘要:在开发过程中,经常会碰到需要利用定时器来完成一些特定的任务. 针对定时器的总结可以参考如下链接:https://yq.aliyun.com/articles/2368?spm=5176.100239.yqblog1.10.ZVwVBe 阅读全文
posted @ 2016-04-13 21:09 moonandstar08 阅读(259) 评论(0) 推荐(0) 编辑
摘要:使用线程池与不使用线程池的差别 先来看一下使用线程池与不适应线程池的差别,第一段代码是使用线程池的: 接着是不使用线程池的: 运行一下,我这里第一段代码使用了线程池的时间是194ms,第二段代码不使用线程池的时间是2043ms。这里默认的线程池中的线程数是100,如果把这个数量减小,虽然系统的处理数 阅读全文
posted @ 2016-04-07 22:52 moonandstar08 阅读(276) 评论(0) 推荐(0) 编辑
摘要:LockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语。Java锁和同步器框架的核心AQS:AbstractQueuedSynchronizer,就是通过调用LockSupport.park()和LockSupport.unpark()实现线程的阻塞和唤醒的。L... 阅读全文
posted @ 2016-01-14 23:04 moonandstar08 阅读(6599) 评论(0) 推荐(1) 编辑
摘要:JAVA的JUC包中的锁包括"独占锁"和"共享锁"。JUC中的共享锁有:CountDownLatch、CyclicBarrier、Semaphore、ReentrantReadWriteLock等。本章会以ReentrantReadWriteLock为蓝本对共享锁进行说明。一、ReentrantL... 阅读全文
posted @ 2016-01-06 22:32 moonandstar08 阅读(467) 评论(0) 推荐(0) 编辑
摘要:线程中断是一种协作机制,线程可以通过这种机制来通知另一个线程,告诉他在合适的或者可能的情况下停止当前工作,并转而执行其他的工作。 通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断。 这好比是家里的父母叮嘱在外的子女要注意身体,但子女是否注意身体,怎么注意身体则完全取决于自己。 ‍‍‍ 阅读全文
posted @ 2015-12-16 21:55 moonandstar08 阅读(488) 评论(0) 推荐(1) 编辑
摘要:在JDK的Collection中我们时常会看到类似于这样的话:例如,ArrayList:注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高... 阅读全文
posted @ 2015-11-17 22:46 moonandstar08 阅读(304) 评论(0) 推荐(0) 编辑
摘要:一、ReentrantLock类ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和内存语义,但是添加了类似锁投票、定时锁等候和可中断锁等候的一些特性。此外,它还提供了在激烈争用情况下更佳的性能(换句话说,当许多线程都想访问共享资源时,JVM 可以花更... 阅读全文
posted @ 2015-11-17 22:28 moonandstar08 阅读(852) 评论(0) 推荐(0) 编辑
摘要:一、join()方法介绍 join() 定义在Thread.java中。join()方法把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的join()方法,直到线程A执行完毕后,才会继续执行线程B。join() 的作用:让主线程”等待“子线程”结束 阅读全文
posted @ 2015-11-02 22:25 moonandstar08 阅读(2339) 评论(0) 推荐(0) 编辑
摘要:一、本地线程变量使用场景 并发应用的一个关键地方就是共享数据。如果你创建一个类对象,实现Runnable接口,然后多个Thread对象使用同样的Runnable对象,全部的线程都共享同样的属性。这意味着,如果你在一个线程里改变一个属性,全部的线程都会受到这个改变的影响。 有时,你希望程序里的各个线程 阅读全文
posted @ 2015-10-26 22:28 moonandstar08 阅读(8006) 评论(1) 推荐(0) 编辑
摘要:通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了. CyclicBarrier类位于java.util.concu 阅读全文
posted @ 2015-10-25 21:53 moonandstar08 阅读(450) 评论(0) 推荐(0) 编辑
摘要:Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。下面这张图完整描述了线程池的类体系结构。首先Executor的execute方法只是执行一个Runnable的任务,当然了从某... 阅读全文
posted @ 2015-10-25 21:07 moonandstar08 阅读(324) 评论(0) 推荐(0) 编辑
摘要:JavaThread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明:NEW 状态是指线程刚创建, 尚未启动RUNNABLE 状态是线程正在正常运行中, 当然可能会有某种耗时计算/IO等待的操作/CPU时间片切换等, 这个状态下发生的等待一般是其他系... 阅读全文
posted @ 2015-10-22 22:47 moonandstar08 阅读(277) 评论(0) 推荐(0) 编辑
摘要:一、简介 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用,负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。 Semaphore可以控制某个资源可被同时访问的个数,通过acquire() 获取一个许可,如果没有就等待;而 release() 释放一个许可。比如在Win... 阅读全文
posted @ 2015-10-22 22:38 moonandstar08 阅读(366) 评论(0) 推荐(0) 编辑
摘要:Runnable是执行工作的独立任务,但是它不返回任何值,如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。一、Runnablejava... 阅读全文
posted @ 2015-10-21 22:37 moonandstar08 阅读(250) 评论(0) 推荐(0) 编辑
摘要:一、闭锁(Latch)闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态。通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开所有线程都将通过,但是一旦大门打开,所有线程都通过了,那么这个闭锁的状态就失效了,门的状态也就不能变了,只能是打开状态... 阅读全文
posted @ 2015-10-21 21:50 moonandstar08 阅读(697) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示