1、锁对象
1.1、lock和condition(ReentrantLock())
Lock lock = new ReentrantLock();
lock.lock();
try {
...
} finally {
lock.unlock();
}
注意一定要释放锁,一般写在finally中。
1.2、可重入锁:线程可以重复的获取已经持有的锁,锁通过以及持有的计数器来跟踪对lock方法的嵌套
比如:一个类中定义一个类变量锁,类中的方法共用这个锁变量在实现同步,这时正一个方法中调用另外一个方法就会出现重入。
2、条件对象
线程进入临界区后,满足一定的条才可以继执行
Lock lock = new ReentrantLock();
Condition contidion = lock.newCondition();
lock.lock();
try {
while(signal) { //条件
condition.await();//阻塞在这里
...
condition.signalAll();//唤醒阻塞在这个条件上的所有线程,对于的condition.signal(),随机唤醒一个线程,有发生死锁的风险
}
...
} finally {
lock.unlock();
}
3、synchronized
作用于方法上:
synchronized method() {
while(signal) {
...
wait();
}
...
notify();/notifyall();
}
作用于代码块上:(客户端锁):使用每个java对象持有锁
Object o = new Object();
synchronized(o) {
...
}
3.1、每一个实例对象都有一个隐藏的锁对象以及相关的条件condition(内部的对象锁只有一个相关条件),不同实例对象之间的同步互不影响;
3.2、当把synchronized用在方法前,锁住的是该实例对象,一旦其他的其他线程方法该对象实例的任何其他被synchronized修饰的方法时都会阻塞,直到获得该对象锁的权限;
3.3、当synchronized修饰静态方法时,锁住的是该Class的类对象,会锁住该类所以被synchronized修饰的静态方法。
会不会锁住非静态的方法?
3.4、局限
不能中断一个正在试图获得锁的线程;
试图获得锁不能设置超时;
每个锁仅有单一的条件,可能不够;
最好既不使用lock/condi也不使用synchronized关键字,通过编发java.util.concurrent包下的安全类来实现自己的业务;
4、volatile域(用于修饰变量)
为实例域的同步访问提供了一种免锁机制
5、使用final修饰共享变量也可以实现安全的访问
6、原子性
7、死锁
死锁的四个必要条件:
8、线程局部变量(threadlocal)
ThreadLocal<String> local = new ThreadLocal<String>();
local.get();
local.set(T t);
local.remove();
9、读写锁
ReentrantLock lock= new ReentrantReadWriteLock();
Lock readLock = lock.readLock();
Lock writeLock = lock.writeLock();
10、为什么弃用thread的stop和suspend方法
stop用来终止一个线程;
suspend用来阻塞直到另外一个线程调用resume方法;
stop通过强制终止一个线程,当该线程处于执行过程中间时被终止,会造成对象的状态不一致;
终止一个线程安全的方式是通过中断的方式,让线程在安全的时候终止;
suspend可能造成死锁(调用suspend方法的线程试图获得同一个锁)
11、阻塞队列(BlockingQueue)
ArrayBlockingQueue:用数组实现的有指定容量和公平性设置的阻塞队列;
LinkedBlockingQueue:用链表实现的无上限的阻塞队列或双向队列;
DelayQueue:构造一个包含Delayed元素的无界的阻塞时间有限的阻塞队列;
ProiorityBlockingQueue:用堆实现无边界阻塞优先队列;
BlockingDeque:
操作
put:满阻塞
take:空阻塞
add:满抛异常IllegalStateException
element返回队列的头元素,空抛异常NoSuchElementException
remove移出并返回头元素,空抛异常NoSuchElementException
offer添加一个元素并返回TRUE,满返回FALSE
peek返回队列的头元素,空返回null
poll移出并返回队列的头元素,空返回null
12、线程安全的集合
ConcurrentHashMap实现原子性的插入和删除
ConcurrentSkipListMap有序的映射表
ConcurrentSkipListSet:有序集
ConcurrentLinkedQueue:安全无边非阻塞队列
13、写数组的拷贝
CopyOnWriteArrayList
CopyOnWriteArraySet
同步包装器类
Collections.synchronizedList();
Collections.synchronizedSet();
Collections.synchronizedsortSet();
Collections.synchronizedMap();
Collections.synchronizedSortMap()
Collections.synchronizedCollection();
14、Callable与Future
Runnable没有返回值,run方法
Callable有返回值,call方法
FutureTask包装器,实现Future和Runnable接口
15、执行器Executor
newCacheThreadPool:必要时创建新的线程,空线程保存60S;
newFixedThreadPool:固定数量的线程,空线程一直保留;
newSingleThreadExecutor:单线程
newScheduleThreadPool:为预定执行而构建固定数量的线程池,替代java.util.Timer
newSingleThreadScheduledExecutor为预定执行而构建的单线程;
ExetucorService:
submit()
控制任务组
invokeAny()
invokeAll()
ExecutorCompletion
16、fock-join框架
RecursiveTask接口compute方法
invokeall
join
17、同步器