线程之间通信
- 概念:
线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体,线程间的通信就是成为整体的比用方式之一。当线程存在通信指挥,系统间的交互性会更强,在提高CPU利用率的同时还会使开发人员对线程任务处理的过程中进行有效的把控和监督。
使用wait/notify方法实现线程间的通信(这两个方法都是Ojbect的类方法,也就是说java为所有的对象都提供了这两个方法)。
- wait和notify必须配合synchronized关键字使用。
- wait方法释放锁,notify方法不释放锁。
1 | public class ListAdd { |
ThreadLocal
- 概念:
线程局部变量,是一种多线程间并发访问变量的解决方案。与synchronized等加锁的方式不同,ThreadLocal完全不提供锁,而使用空间换时间的手段,为每个变量提供变量的独立副本,以保证线程安全。从性能上来说,ThreadLocal不具备绝对的优势,在并发不是很高的时候,加锁的性能会更好,但作为一套与锁安全无关的线程安全解决方案,在高并发量或者竞争激烈的场景,使用ThreadLocal可以在一定程度上减少锁竞争。
1 | public class ConnThreadLocal { |
单例&多线程
单例模式,最常见的就是饥饿模式和懒汉模式,一个直接实例化对象, 一个在调用方法时进行实例化对象。在多线程模式中,考虑到性能和线程安全问题,我们一般选择两种比较经典的单例模式,在性能提高的同时,有保证了线程安全。
- dubble check instance.
- static inner class.
1 | public class DubboCheck { |
1 | public class InnerClass { |