SlideShare a Scribd company logo
1 of 64
Download to read offline
LOGO
Java多线程技术分享
吴强
内容
线程和进程1
Java线程创建及常用API2
Java内存模型
线程同步实现 - snychronized和Lock
1
2
3
4
线程通信 - 等待通知机制2
Fork/Join模式介绍
5
6
相关概念
线程
多线程
进程
一个具有一定独立
功能的程序关于某
个数据集合的一次
运行活动。它是操
作系统动态执行的
基本单元,在传统
的操作系统中,进
程既是基本的分配
单元,也是基本的
执行单元。
程序中一个单一的
顺序控制流程。进
程内一个相对独立
的、可调度的执行
单元,是系统独立
调度和分派CPU的
基本单位指运行中
的程序的调度单位
在单个程序中同时
运行多个线程完成
不同的工作,称为
多线程。多线程是
异步的,线程被调
用的时机是随机的
线程与进程区别
地址空间和其它资源(如打开文件):进程间相互独立,同一进程
的各线程间共享。某进程内的线程在其它进程不可见。
1
进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来
进行通信--需要进程同步和互斥手段的辅助,以保证数据的一致性。
2
调度和切换:线程上下文切换比进程上下文切换要快得多。
在多线程OS中,进程不是一个可执行的实体。
1
2
3
4
线程状态图
创建线程
Java中创建线程有2种方式:
l继承Thread类,重写run()方法
l实现Runnable接口,实现run()方法
二者的关系
public class Thread implements Runnable
Thread类实现Runnable接口
Runnable接口实现类作为Thread类构造器入参
常用API
currentThread()
获取当前正在执行的线程。
这是一个静态方法。
isAlive()
判断当前线程是否处于活动状态。
boolean:true-存活,false-销毁
sleep(...)
在指定时间内,让当前线程放弃CPU资源,使当前线程
休眠。
注意:如果在锁内,该方法不释放锁。
常用API
interrupt()
将线程里的中断标志位设为true。
interrupted()
判断当前线程是否已经是中断状态,如果是中断状态返
回true。
执行后,具有清除状态功能,即第二次调用后返回false。
静态方法。
isInterrupted()
判断线程Thread对象是否已经是中断状态,如果是中断
状态返回true。
执行后,不清除中断状态,即多次调用后依旧返回true。
常用API
join()
等待该线程终止。
注意:如果在锁内,该方法释放锁。
getId()
取得线程的唯一标识。
yield()
放弃当前线程的CPU资源。
线程优先级
Java中,线程的优先级分为1~10个等级,CPU优化执行等
级高的线程。
l setPriority(int newPriority)
设置线程的优先级。
l getPriority()
获取线程的优先级。
线程的优先级具有继承性,比如A线程启动B线程,则B线程
的优先级和A一样。
守护线程
Java线程中有两种线程:
用户线程
守护线程。
守护线程是一种特殊的线程,它的特性有陪伴的含义,当进
程中不存在用户线程时,守护线程自动销毁。
setDaemon(boolean on)
设置线程是否为守护线程。
true-设置为守护线程
停止线程
使用interrupt()方法
结合异常停止线程
问题
v什么时候需要同步?
v为什么需要同步?
问题解答
v什么时候需要同步?
当存在线程安全问题时,需要同步。
线程安全问题都是由全局变量及静态变量引起的。
线程安全:如果你的代码所在的进程中有多个线程在同时运
行,而这些线程可能会同时运行这段代码。如果每次运行结
果和单线程运行的结果是一样的,而且其他的变量的值也和
预期的是一样的,就是线程安全的。
v为什么需要同步?
非线程安全可能导致脏读,引起数据无效问题。
Java内存模型
v为什么全局变量和静态变量会引起线程安全问题?
下面从Java内存模型中寻找答案。
Java内存模型
vJVM运行时数据区
Java内存模型
v内存模型的概念
内存模型描述的是程序中各变量(实例域、静态域和数
组元素)之间的关系,以及在实际计算机系统中将变量存储
到内存和从内存取出变量这样的低层细节.
Java内存模型规定了所有的变量都存储在主内存中,每条线
程都有自己的工作内存。线程的工作内存保存了该线程使用
到的变量的主内存副本拷贝,线程对变量的所有操作(读取、
赋值等)都必须在工作内存中进行,而不能直接读写主内存
中的变量。不同的线程之间不能直接访问对方工作内存中的
变量,线程间变量值的传递均需要通过主内存来完成。
Java内存模型
v线程、工作内存、主内存交互关系
全局变量存储于堆中的对象实例数据部分
静态变量存储于方法区中
Java内存模型
v内存间交互操作
主内存与工作内存之间具体的交互协议,即一
个变量如何从主内存拷贝到工作内存,如何从工作
内存同步回主内存之类的实现细节,Java内存模型
定义了8种操作来完成。
注:虚拟机实现时,必须保证这8种操作都是原子
的、不可再分的。
JAVA内存模型
lock(锁定)
unlock(解锁)
read(读取)
load(载入)
Java内存模型
8种操作
use(使用)
assign(赋值)
store(存储)
write(写入)
Java内存模型
v内存间交互操作
l lock(锁定)
作用于主内存的变量,它把一个变量标识为一条线程独占的
状态。
l unlock(解锁)
作用于主内存的变量,它把一个处于锁定状态的变量释放出
来,释放后的变量才可以被其他线程锁定。
l read(读取)
作用于主内存的变量,它把一个变量的值从主内存传输到线
程的工作内存中,以便随后的load操作使用。
Java内存模型
v内存间交互操作
l load(载入)
作用于工作内存的变量,它把read操作从主内存中得到的变
量值放入工作内存的变量副本中。
l use(使用)
作用于工作内存的变量,它把工作内存中的一个变量的值传
递给执行引擎,每当虚拟机遇到一个需要使用到变量的值的
字节码指令时将会执行这个操作。
l assign(赋值)
作用于工作内存的变量,它把一个从执行引擎接收到的值赋
给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节
码指令时将会执行这个操作。
Java内存模型
v内存间交互操作
l store(存储)
作用于工作内存的变量,它把工作内存中的一个变量的值传
送到主内存中,以便随后的write操作使用。
l write(写入)
作用于主内存的变量,它把store操作从工作内存中得到的
变量的值放入主内存的变量中。
Java内存模型
v内存间交互操作
l 将一个变量从主内存拷贝到工作内存中,就要顺序地执行
read和load操作。
l 将一个变量从工作内存中同步回主内存,就要顺序地执行
store和write操作。
注:Java内存模型只要求上述两个操作必须按照顺序执行,
而没有保证是连续执行。
Java内存模型
v内存间交互操作规则
Java内存模型规定,执行上述8种基本操作时必须满足8
种规则。
ü 不允许read和load、store和write操作之一单独出现,即
不允许一个变量从主内存读取了但工作内存不接受,或者
从工作内存发起回写但主内存不接受的情况出现。
ü 不允许一个线程丢弃它的最近的assign操作,即变量在工
作内存中改变了之后必须把该变化同步回主内存中。
ü 不允许一个线程无原因地(没有发生任何assign操作)把
数据从线程的工作内存同步回主内存中。
Java内存模型
v内存间交互操作规则
ü 一个新的变量只能在主内存中“诞生”,不允许在工作内存
中直接使用一个未被初始化(load或assign)的变量,换
句话说,就是对一个变量进行use、store操作之前,必须
先执行过load和assign操作。
ü 一个变量在同一个时刻只允许一条线程对其进行lock操作,
但lock操作可以被同一条线程重复执行多次(可重入),
多次执行lock后,只有执行相同次数的unlock操作,变量
才会被解锁。
ü 如果对一个变量执行lock操作,那将会清空工作内存中此
变量的值,在执行引擎使用这个变量前,需要重新执行
load或assign操作初始化变量的值。
Java内存模型
v内存间交互操作规则
ü 如果一个变量事先没有被lock操作锁定,那就不允许对它
进行unlock操作,也不允许去unlock一个被其他线程锁
定住的变量。
ü 一个变量执行unlock操作之前,必须先把此变量同步回主
内存中(执行store、write操作)。
Java内存模型定义的8种内存访问操作加上8种规定,基本上
就可以确定Java程序中哪些内存访问操作在并发下是安全的
(线程安全)。
Java内存模型
v 使用88操作规定判断是否线程安全实例
可见性指一
个线程修改
了共享变量
的值,另外
一个线程立
即能够获得
这个修改。
一个操作是原子
操作,那么我们
称它具有原子性。
原子操作
(atomic
operation):不
可被中断的一个
或一系列操作。
同一个线程内
,所有操作都
是有序的,从
一个线程观察
另外一个线程
,都是无序的
。
Java内存模型
原子性 可见性 有序性
总结:Java内存模型主要围绕在并发过程中如何处理原子性、可见性和有序性这3个特征
来建立的。
Java内存模型
原子性
Java内存模型通过原子性操作来保证原
子性。
可见性
Java内存模型通过变量工作内存同步回
写主内存保证可见性。
有序性
Java内存模型通过“一个变量在同一个时
刻只允许一条线程对其进行lock操作”这
条规则保证有序性。
Java内存模型
v 先行发生原则
Java内存模型定义的8种操作和8种规定相当严谨且又十分烦
琐,实践起来比较麻烦,因此可以使用一个和88操作规定等
效的判断原则——先行发生原则,来确定一个访问在并发环
境下是否线程安全。
v 先行发生原则概念
Java内存模型中定义的两项操作之间的偏序关系,如果说操
作A先行发生于操作B,那么操作A产生的影响能被操作B观
察到。这种影响包括:修改了内存中共享变量的值、发送的
消息、调用的方法等。
Java内存模型
1
程序次序规则
在一个线程内,按
照程序代码顺序,
书写在前面的操作
先行发生于书写在
后面的操作。
2
管理锁定规则
一个unlock操作先行发
生于后面对同一个锁的
lock操作。
注意:必须是同一个锁,
而“后面”是指时间上的
先后顺序。
3
volatile变量规则
对一个volatile变量
的写操作先行发生
于后面对这个变量
的读操作。
注意:这里的“后
面”是指时间上的
先后顺序。
v Jave中8个先行发生关系
Java内存模型
4
线程启动规则
Thread对象的
start()方法先行发
生于此线程的每一
个动作。
5
线程终止规则
线程中的所有操作
都先行发生于对此
线程的终止检测。
6
线程中断规则
对线程interrupt()
方法的调用先行发
生于被中断线程的
代码检测到中断事
件的发生。
Jave中8个先行发生关系
Java内存模型
7
对象终结规则
一个对象的初始化
完成(构造函数执
行结束)先行发生
于它的finalize()方
法的开始。
8
传递性
如果操作A先行发
生于操作B,操作
B先行发生于操作
C,那么也可以得
到操作A先行发生
于操作C的结论。
v Jave中8个先行发生关系
Java内存模型
v 先行发生原则分析实例
有两个线程,线程A调用setNum(1)方法,
线程B调用getNum()方法,那么B线程的返
回值是什么?
由于不满足Java的8个先行发生关系,则线程B的返回值可
能为0,也可能为1,非线程安全。
使用snychronized保证同步
l 当synchronized作用在方法上时,锁住的便是对象实例
(this)。
l 当作用在静态方法时锁住的便是对象对应的Class实例。
因为Class数据存在于永久带,因此静态方法锁相当于该
类的一个全局锁
l 当synchronized作用于某一个对象实例时,锁住的便是
对应的代码块。
在HotSpot JVM实现中,synchronized锁有个专门的名字:
对象监视器。
synchronized是一个对象锁、悲观锁、非公平锁。
使用snychronized保证同步
l JVM snychronized实现原理
实现思路:基于链式队列实现。
当多个线程同时请求某个对象监视器时,对象监视器会设置几种状态用来区分
请求的线程:
ü ContentionList:所有请求锁的线程将被首先放置到该竞争队列
ü EntryList:ContentionList中那些有资格成为候选人的线程被移到Entry
List
ü WaitSet:那些调用wait方法被阻塞的线程被放置到Wait Set
ü OnDeck:任何时刻最多只能有一个线程正在竞争锁,该线程称为OnDeck
ü Owner:获得锁的线程称为Owner
ü !Owner:释放锁的线程
JVM snychronized实现原理
实现思路:基于链式队列实现。
新请求锁的线程将首先被加入到ConetentionList中,当某个拥有锁的线程
(Owner状态)调用unlock之后,如果发现 EntryList为空则从ContentionList
中移动线程到EntryList。
使用snychronized保证同步
l snychronized关键字总结:
snychronized关键字保证了原子性、可见性、有序性,实
现了线程安全。
l 缺点:
1.多线程竞争的情况下,频繁的加锁解锁导致过多的线程上
下文切换,由于java线程是基于操作系统内核线程实现的,
所以如果阻塞或者唤醒线程都需要切换到内核态操作,这需
要耗费许多CPU资源。
2.一个线程持有锁,会导致其他请求该锁的线程挂起。
3.死锁
使用snychronized保证同步
l 原子性
一个操作是原子操作,那么我们称它具有原子性。
原子操作(atomic operation):不可被中断的一个或一系列
操作。
l 可见性
可见性指一个线程修改了共享变量的值,另外一个线程立即
能够获得这个修改。
l 有序性
同一个线程内,所有操作都是有序的,从一个线程观察另外
一个线程,都是无序的。
JVM会保证有序性。
使用Lock保证同步
使用ReentrantLock保证同步
l 可重入锁ReentrantLock常用API
ü public void lock()
加锁,如果有别的线程获取了锁,则等待
ü public void unlock()
释放锁
ü public final boolean isFair()
判断该锁是否为公平锁
ü public boolean tryLock()
如果该锁未被别的线程占用,则加锁
ü public boolean tryLock(long timeout, TimeUnit unit)
throws InterruptedException
在指定等待时间内,该锁未被别的线程占用,则加锁
可重入锁ReentrantLock构造函数
Øpublic ReentrantLock()
构造可重入锁ReentrantLock对象,该锁为非公平锁
Øpublic ReentrantLock(boolean fair)
构造可重入锁ReentrantLock对象
如果fair为true,则该锁为公平锁
如果fair为false,则该锁为非公平锁
ReentrantLock锁具有完成互斥排他的效果,即同一时间只有一个线程
在执行lock()后面的任务,通过unlock()释放锁,故保证了线程安全。
ReentrantLock是一种乐观锁。
可重入锁ReentrantLock使用
//可重入锁,非公平锁
private Lock lock = new ReentrantLock();
public void method(){
try{
lock.lock();//加锁
}finally{
lock.unlock();//释放锁
}
}
可重入锁ReentrantLock使用
//可重入锁,公平锁
private Lock lock = new ReentrantLock(true);
public void waitMethod(){
try{
//在3秒内尝试获取锁
if(lock.tryLock(3, TimeUnit.SECONDS)){
System.out.println("在3秒内时间内,我获取锁了");
}else{
System.out.println("在3秒内时间内,我没有获取锁");
}
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.unlock();//释放锁
}
}
使用ReentrantReadWriteLock保证同步
l 可重入读写锁ReentrantReadWriteLock
读写锁有两个锁,一个读操作相关的锁,称为读锁或共享锁,另一
个写操作相关的锁,称为写锁或排他锁。
读锁之间不互斥,读锁与写锁互斥,写锁与写锁互斥。即多个线程
可以同时进行读取操作,但同一时刻只允许一个线程进行写入操作。
l 构造函数
ü public ReentrantReadWriteLock()
构造可重入读写锁ReentrantReadWriteLock对象,该锁是个非公平锁
ü public ReentrantReadWriteLock(boolean fair)
构造可重入读写锁ReentrantReadWriteLock对象
如果fair为true,则该锁为公平锁
如果fair为false,则该锁为非公平锁
使用ReentrantReadWriteLock保证同步
l 可重入读写锁ReentrantReadWriteLock的使用
//可重入读写锁,非公平锁
private ReadWriteLock lock = new ReentrantReadWriteLock();
//读锁
private final Lock readLock = lock.readLock();
public void readMethod(){
try{
readLock.lock();//读锁
}finally{
readLock.unlock();//释放锁
}
}
使用ReentrantReadWriteLock保证同步
l 可重入读写锁ReentrantReadWriteLock的使用
//可重入读写锁,公平锁
private ReadWriteLock lock = new ReentrantReadWriteLock(true);
//写锁
private final Lock writeLock = lock.writeLock();
public void writeMethod(){
try{
writeLock.lock();//写锁
}finally{
writeLock.unlock();//释放锁
}
}
Lock与synchronized区别
l Lock与synchronized都能保证线程安全,但Lock是一种乐观锁,而
synchronized是一种悲观锁。synchronized导致线程排队,而Lock
可以使线程在等待了足够长的时间以后,中断等待,而干别的事情。
l synchronized在代码执行时出现异常,JVM会自动释放锁,但是
Lock则不行,lock是通过代码实现的,要保证锁一定会被释放,就
必须将unLock()放到finally{}中。
l 在资源竞争不是很激烈的情况下,synchronized的性能要优于Lock,
但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十
倍,而Lock的性能能维持常态
注:JDK1.5中,对synchronized进行了优化,并且还有优化的空间,
因此我们写同步的时候,优先考虑synchronized。
JAVA原子类保证同步
AtomicBoolean 可以用原子方式更新的 boolean 值。
AtomicInteger 可以用原子方式更新的 int 值。
AtomicIntegerArray 可以用原子方式更新其元素的 int 数组。
AtomicIntegerFieldUpdater<T> 基于反射的实用工具,可以对指定类的指定 volatile int 字段进行原
子更新。
AtomicLong 可以用原子方式更新的 long 值。
AtomicLongArray 可以用原子方式更新其元素的 long 数组。
AtomicLongFieldUpdater<T> 基于反射的实用工具,可以对指定类的指定 volatile long 字段进行原
子更新。
AtomicMarkableReference<V> AtomicMarkableReference 维护带有标记位的对象引用,可以原子
方式对其进行更新。
AtomicReference<V> 可以用原子方式更新的对象引用。
AtomicReferenceArray<E> 可以用原子方式更新其元素的对象引用数组。
AtomicReferenceFieldUpdater<T,V> 基于反射的实用工具,可以对指定类的指定 volatile 字段进行
原子更新。
AtomicStampedReference<V> AtomicStampedReference 维护带有整数“标志”的对象引用,可以
用原子方式对其进行更新。
对单一数据的操作,实现了原子化
访问对2个或2个以上的atomic变量(或者对单个atomic变量进行2次或2次以上的操作)通常认为是需
要同步的,以达到让这些操作能被作为一个原子单元。
JAVA原子类保证同步
l AtomicInteger源码
AtomicInteger如何保证单一数据操作的线程安全?
//AtomicInteger中保存int值的变量,volatile 关键字保证了可见性
private volatile int value;
//构造函数
public AtomicInteger(int initialValue) {
value = initialValue;//初始化value的值
}
//自动增长
public final int incrementAndGet() {
for (;;) {
int current = get();//获取当前value值
int next = current + 1;//自动增长,加1
//调用sun.misc.Unsafe,判断value值是否被修改,如果被修改在for循环中循环改过程
//如果未被修改,返回修改后的值
//该方法是个原子方法
if (compareAndSet(current,next))
return next;
}
}
Volatile关键字
l volatile关键字主要保证可见性。
ü volatile关键字是线程安全的轻量级实现,所以其性能比
synchronized要好,并且volatile只能修饰于变量。
ü 多线程访问volatile不会发生阻塞。
ü volatile能保证数据的可见性,但不能保证原子性,故
volatile并不能保证线程安全。
因此,volatile关键字一般用于状态判断中。
ThreadLocal类
l 另一种思路
对于多线程资源共享的问题,同步机制采用了“以时间换空
间”的方式,而ThreadLocal采用了“以空间换时间”的方
式。
前者仅提供一份变量,让不同的线程排队访问,而后者为每
一个线程都提供了一份变量,因此可以同时访问而互不影响。
ThreadLocal为每个使用该变量的线程提供独立的变量副本,
所以每一个线程都可以独立地改变自己的副本,而不会影响
其它线程所对应的副本。
ThreadLocal使用
线程间通信 - 等待/通知机制
l 使用wait/notify实现线程间通信
ü wait()方法
使当前执行代码的线程进行等待,wait()方法是Object方法,该方法
用来将当前线程置于等待队列中,并且在wait()所在代码行处停止执行,
直到接到notify()或notifyAll()发出的通知或被中断为止。
在调用wait()方法之前,线程必须获得该对象的对象级别锁,即只能
在同步方法或同步块中调用wait()方法。在执行wait()方法后,当前线程
释放锁。当接到通知后,当前线程与别的线程重新竞争锁,获得锁后,
继续向下执行。如果调用wait()方法时没有持有锁,则抛出
IllegalMonitorStateException异常。
线程间通信 - 等待/通知机制
l 使用wait/notify实现线程间通信
ü notify()方法
notify()方法用来通知那些可能等待该对象的对象锁的其他线程,如
果有多个线程等待,则由线程规划器随机挑选一个wait状态的线程。该
方法也是Object类方法,在调用该方法之前,线程必须获得该对象的对
象级别锁,即只能在同步方法或同步块中调用notify()方法。如果调用
nitify()方法之前,没有持有对象锁,则抛出IllegalMonitorStateException
异常。
nitify()方法执行后,当前线程不会马上释放该对象的对象锁,wait状
态的线程也不能马上获取该对象锁,要等到notify()方法的线程将程序执
行完,当前线程才会释放锁,而此时wait状态的线程才可以获取该对象
的对象锁。
使用wait/notify实现线程间通信实例
线程池
l 自定义线程池
自定义线程池三要素包括:
1、存储线程的容器(或叫线程池)。该容器可使用数
组或链表,容器中存放执行线程。
2、执行线程(或叫执行器)。具体执行的线程。
3、执行任务。执行线程需要执行的具体任务。
实例:http://www.cnblogs.com/wuq126/p/5412602.html
线程池
l Java线程池
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处
理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,
超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任
务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一
的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先
级)执行。
多线程下的单例模式
l 使用DCL构建单例模式
DCL:双检查锁机制
Company Logo
Fork/Join模式介绍
l Fork/Join介绍
Fork/Join框架是Java7提供的一个用于并行执行任务的框架, 是一个把
大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结
果的框架。
Fork/Join模式介绍
l Fork/Join常用类说明
ü RecursiveAction:供不需要返回值的任务。
ü RecursiveTask:通过泛型参数设置计算任务的返回值。
ü ForkJoinPool:提供了一系列的submit方法,计算任务。
使用时,继承RecursiveAction或RecursiveTask类,实现任务的划分,
通过ForkJoinPool类进行提交合并任务结果。
Fork/Join模式介绍
l Fork/Join简单实例
LOGO

More Related Content

Viewers also liked

自己的JVM自己救: 解救 OOM 實務經驗談 (JCConf 2015)
自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
自己的JVM自己救: 解救 OOM 實務經驗談 (JCConf 2015)Leon Chen
 
Lock Interface in Java
Lock Interface in JavaLock Interface in Java
Lock Interface in JavaHome
 
Recipe 黃佳伶 葉愛慧
Recipe 黃佳伶 葉愛慧Recipe 黃佳伶 葉愛慧
Recipe 黃佳伶 葉愛慧10y2try
 
浅谈项目管理(诸葛B2B电商研发部版改)
浅谈项目管理(诸葛B2B电商研发部版改)浅谈项目管理(诸葛B2B电商研发部版改)
浅谈项目管理(诸葛B2B电商研发部版改)诸葛修车网-诸葛商城
 
Thrift+scribe实现分布式日志收集,并与log4j集成
Thrift+scribe实现分布式日志收集,并与log4j集成Thrift+scribe实现分布式日志收集,并与log4j集成
Thrift+scribe实现分布式日志收集,并与log4j集成zhongbing liu
 
Performance Tuning - Understanding Garbage Collection
Performance Tuning - Understanding Garbage CollectionPerformance Tuning - Understanding Garbage Collection
Performance Tuning - Understanding Garbage CollectionHaribabu Nandyal Padmanaban
 
Concurrency: Best Practices
Concurrency: Best PracticesConcurrency: Best Practices
Concurrency: Best PracticesIndicThreads
 
[Java concurrency]02.basic thread synchronization
[Java concurrency]02.basic thread synchronization[Java concurrency]02.basic thread synchronization
[Java concurrency]02.basic thread synchronizationxuehan zhu
 
Java concurrency - Thread pools
Java concurrency - Thread poolsJava concurrency - Thread pools
Java concurrency - Thread poolsmaksym220889
 
淺談 Java GC 原理、調教和 新發展
淺談 Java GC 原理、調教和新發展淺談 Java GC 原理、調教和新發展
淺談 Java GC 原理、調教和 新發展Leon Chen
 
On heap cache vs off-heap cache
On heap cache vs off-heap cacheOn heap cache vs off-heap cache
On heap cache vs off-heap cachergrebski
 
Introduction of Java GC Tuning and Java Java Mission Control
Introduction of Java GC Tuning and Java Java Mission ControlIntroduction of Java GC Tuning and Java Java Mission Control
Introduction of Java GC Tuning and Java Java Mission ControlLeon Chen
 

Viewers also liked (14)

自己的JVM自己救: 解救 OOM 實務經驗談 (JCConf 2015)
自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
自己的JVM自己救: 解救 OOM 實務經驗談 (JCConf 2015)
 
Lock Interface in Java
Lock Interface in JavaLock Interface in Java
Lock Interface in Java
 
Git基础培训
Git基础培训Git基础培训
Git基础培训
 
Recipe 黃佳伶 葉愛慧
Recipe 黃佳伶 葉愛慧Recipe 黃佳伶 葉愛慧
Recipe 黃佳伶 葉愛慧
 
浅谈项目管理(诸葛B2B电商研发部版改)
浅谈项目管理(诸葛B2B电商研发部版改)浅谈项目管理(诸葛B2B电商研发部版改)
浅谈项目管理(诸葛B2B电商研发部版改)
 
Thrift+scribe实现分布式日志收集,并与log4j集成
Thrift+scribe实现分布式日志收集,并与log4j集成Thrift+scribe实现分布式日志收集,并与log4j集成
Thrift+scribe实现分布式日志收集,并与log4j集成
 
Performance Tuning - Understanding Garbage Collection
Performance Tuning - Understanding Garbage CollectionPerformance Tuning - Understanding Garbage Collection
Performance Tuning - Understanding Garbage Collection
 
Concurrency: Best Practices
Concurrency: Best PracticesConcurrency: Best Practices
Concurrency: Best Practices
 
[Java concurrency]02.basic thread synchronization
[Java concurrency]02.basic thread synchronization[Java concurrency]02.basic thread synchronization
[Java concurrency]02.basic thread synchronization
 
JVM及其调优
JVM及其调优JVM及其调优
JVM及其调优
 
Java concurrency - Thread pools
Java concurrency - Thread poolsJava concurrency - Thread pools
Java concurrency - Thread pools
 
淺談 Java GC 原理、調教和 新發展
淺談 Java GC 原理、調教和新發展淺談 Java GC 原理、調教和新發展
淺談 Java GC 原理、調教和 新發展
 
On heap cache vs off-heap cache
On heap cache vs off-heap cacheOn heap cache vs off-heap cache
On heap cache vs off-heap cache
 
Introduction of Java GC Tuning and Java Java Mission Control
Introduction of Java GC Tuning and Java Java Mission ControlIntroduction of Java GC Tuning and Java Java Mission Control
Introduction of Java GC Tuning and Java Java Mission Control
 

Similar to Java多线程技术

Java并发编程培训
Java并发编程培训Java并发编程培训
Java并发编程培训dcshi
 
Java并发编程培训
Java并发编程培训Java并发编程培训
Java并发编程培训longhao
 
数据库持续集成
数据库持续集成数据库持续集成
数据库持续集成wait4friend
 
异步和队列分享
异步和队列分享异步和队列分享
异步和队列分享Tony Deng
 
Java面试笔试题大汇总
Java面试笔试题大汇总Java面试笔试题大汇总
Java面试笔试题大汇总yiditushe
 
漫谈php和java
漫谈php和java漫谈php和java
漫谈php和javasulong
 
I6功能讨论
I6功能讨论I6功能讨论
I6功能讨论Song Xu
 
Entity Framework實戰
Entity Framework實戰Entity Framework實戰
Entity Framework實戰國昭 張
 
Workflow engine
Workflow engineWorkflow engine
Workflow enginePokai Hsu
 
作業系統數位教材(劉政雄)(1 9)
作業系統數位教材(劉政雄)(1 9)作業系統數位教材(劉政雄)(1 9)
作業系統數位教材(劉政雄)(1 9)Ying wei (Joe) Chou
 
系統程式 -- 第 10 章
系統程式 -- 第 10 章系統程式 -- 第 10 章
系統程式 -- 第 10 章鍾誠 陳鍾誠
 
Oprofile linux
Oprofile linuxOprofile linux
Oprofile linuxFeng Yu
 
1, workflow intro
1, workflow intro1, workflow intro
1, workflow introted-xu
 

Similar to Java多线程技术 (20)

Java并发编程培训
Java并发编程培训Java并发编程培训
Java并发编程培训
 
Java并发编程培训
Java并发编程培训Java并发编程培训
Java并发编程培训
 
数据库持续集成
数据库持续集成数据库持续集成
数据库持续集成
 
异步和队列分享
异步和队列分享异步和队列分享
异步和队列分享
 
Multithread
MultithreadMultithread
Multithread
 
Java面试笔试题大汇总
Java面试笔试题大汇总Java面试笔试题大汇总
Java面试笔试题大汇总
 
Chapter2
Chapter2  Chapter2
Chapter2
 
漫谈php和java
漫谈php和java漫谈php和java
漫谈php和java
 
I6功能讨论
I6功能讨论I6功能讨论
I6功能讨论
 
Ch04
Ch04Ch04
Ch04
 
Linux chapt3
Linux chapt3Linux chapt3
Linux chapt3
 
Entity Framework實戰
Entity Framework實戰Entity Framework實戰
Entity Framework實戰
 
Workflow engine
Workflow engineWorkflow engine
Workflow engine
 
作業系統數位教材(劉政雄)(1 9)
作業系統數位教材(劉政雄)(1 9)作業系統數位教材(劉政雄)(1 9)
作業系統數位教材(劉政雄)(1 9)
 
系統程式 -- 第 10 章
系統程式 -- 第 10 章系統程式 -- 第 10 章
系統程式 -- 第 10 章
 
Oprofile linux
Oprofile linuxOprofile linux
Oprofile linux
 
Plc3
Plc3Plc3
Plc3
 
1, workflow intro
1, workflow intro1, workflow intro
1, workflow intro
 
笔记
笔记笔记
笔记
 
beidakejian
beidakejianbeidakejian
beidakejian
 

More from 诸葛修车网-诸葛商城

More from 诸葛修车网-诸葛商城 (7)

组合、备忘录、建造者模式、原型
组合、备忘录、建造者模式、原型组合、备忘录、建造者模式、原型
组合、备忘录、建造者模式、原型
 
设计模式-单例、享元、工厂与抽象工厂
设计模式-单例、享元、工厂与抽象工厂设计模式-单例、享元、工厂与抽象工厂
设计模式-单例、享元、工厂与抽象工厂
 
面向对象设计原则
面向对象设计原则面向对象设计原则
面向对象设计原则
 
单元测试(Unit Test)- Spock应用
单元测试(Unit Test)- Spock应用单元测试(Unit Test)- Spock应用
单元测试(Unit Test)- Spock应用
 
Maven技术及诸葛商城应用(1)
Maven技术及诸葛商城应用(1)Maven技术及诸葛商城应用(1)
Maven技术及诸葛商城应用(1)
 
Push-推送技术
Push-推送技术Push-推送技术
Push-推送技术
 
Sonar java -Write Clean Code,Detect Bugs
Sonar java -Write Clean Code,Detect BugsSonar java -Write Clean Code,Detect Bugs
Sonar java -Write Clean Code,Detect Bugs
 

Java多线程技术