Java并发

2020-05-12  本文已影响0人  Yves_Chen

Java并发

Object

wait&notify

调用时必须拿到对象的锁

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。

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

Disruptor

环形队列

伪共享

上一篇下一篇

猜你喜欢

热点阅读