Java并发
Java并发
Object
wait¬ify
调用时必须拿到对象的锁
synchronized(object)
{
object.wait();//object.notify()
}
调用wait()后,会自动释放锁,sleep不会释放锁。wait的线程被notify唤醒,会先重新获取对象锁再执行。
Thread
stop
判断volatile标记
interrupt
void Thread.interrupt() 设置中断标记
boolean Thread.isInterrupted() 判断是否中断
boolean Thread.interrupted() 判断是否中断并清除标记
中断和stop线程使用自定义volatile标记类似
不同点,当线程sleep或wait时,自定义标记无法退出,但调用Thread.interrupt()会让sleep方法抛出InterruptedException并清除终端标记,程序可捕获该异常正常退出
join
等待线程执行完成后,主线程再执行
while(isAlive())
{
wait(0);
}
本质上是通过wait notifyAll实现。
yield
ThreadGroup
volatile
synchronized
不可重入
Lock
ReentrantLock
重入锁
公平锁
超时
实现要点:
1.原子状态。原子状态使用CAS操作来存储当前锁的状态,判断锁是否已经被别的线程持有。
2.等待队列。所有没有请求到锁的线程,会进入等待队列进行等待。待有线程释放锁后,系统从等待队列唤醒一个线程,继续工作。
3.阻塞原语park()和unpark(),用来挂起和恢复线程。没有得到锁的线程将会被挂起。有关park()和unpark()的详细介绍,参考LockSupport。
-
Condition
调用时必须拿到持有重入锁
lock.lock();
condition.await();//condition.signal()
lock.unlock();
调用await()后,会自动释放锁,sleep不会释放锁。await的线程被signal唤醒,会先重新获取对象锁再执行。
Semaphore
适合过载控制
ReentrantReadWriteLock
CountDownLatch
CountDownLatch end = new CountDownLatch(10);
end.countDown;
end.await();
CyclicBarrier
CyclicBarrier cb = new CyclicBarrier(10, new Runable());
cb.await();
cb.await();
cb.await();...
runable->run
LockSupport
t1:LockSupport.park()
main t:LockSupport.unpark(t1)
ThreadPoolExecutor
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
调度逻辑
调度逻辑拒绝策略
AbortPolicy:直接抛出异常。
CallerRunsPolicy:直接由当前线程执行任务。
DiscardOldestPolicy:丢弃最老的任务,尝试重新提交当前任务。
DiscardPolicy:直接丢弃当前任务。
可实现RejectedExecutionHandler实现自定义Policy。
线程数量设置经验
线程数量设置经验Fork/Join
执行逻辑
执行逻辑- 互相帮助
互相帮助
ForkJoinPool
ThreadLocal
每个线程都有自己的ThreadLocalMap,其中key为ThreadLocal对象,示例中value为SimpleDateFormat实例。
ThreadLocal对象的get方法,会先获取调用线程的ThreadLocalMap,然后以ThreadLocal对象为key取出对应的value。
ThreadLocalMap类似WeakHashMap,key是WeakReference<ThreadLocal>,当ThreadLocal的外部强引用被回收时,ThreadLocal对象将被回收,key将会为null。当系统清理ThreadLocalMap时,(比如将新的变量加入Map时会自动进行一次清理),将会回收对应的value对象。
ThreadLocal