二、什么是线程安全
当多个线程访问某个类时,不管运行时采用的何种调度方式或者这些线程如何交替执行,并且再主调度代码也不需要任何额外的同步或者协同,这个类能表现出正确的行为,那么这个类就是线程安全的。
三、对象共享
线程封闭
-
栈封闭:栈封闭中,只能通过局部变量才能访问对象。
-
ThreadLocal类:使用ThreadLocal存储变量。
只读共享
不可变:对象不能修改,对象的所有域是final,对象创建时没有逸出。
线程安全共享
在对象内部实现同步,多线程通过对象公共接口访问。
保护对象
通过持有特定的锁进行访问,如外部使用synchronize或者lock
五、基础构建模块
并发容器
-
ConcurrentHashMap: jdk1.7之前采用分段锁,1.7之后对hash表的head加锁,若head为空,则使用CAS设置head。
-
CopyOnWriteArrayList:在写入时复制,读取的还是原先的列表,当写入完成,则进行赋值。
生产者-消费者
-
BlockingQueue:支持可阻塞的take与put。
-
Deque:双端队列,工作密取,消费者共享一个工作队列,都有一个各自的双端队列,当自己的队列为空时,可以从其他的双端队列的尾部获取。
同步工具类
-
CountDownLatch:设置一个数3,await阻塞等待,当 countDown时减1,到减少到0时,await线程唤醒。
-
FutureTask:在使用线程池异步处理任务时,可使用future.get等待处理完成。
-
Semaphore:设置一个数3,使用时调用 acquire减1,调用release加1,当 acquire时已经为0,则阻塞。
-
CyclicBarrier:设置一个数3,调用 await减1并阻塞,当减少到0时,唤醒所有阻塞线程,并恢复到3。