一、volatile
使用volatile标识变量,将迫使所有线程均读写主内存中的对应变量,从而使得volatile变量在多线程间可见。
二、同步关键字synchronized
它是最常用的同步方法之一,简洁明了,代码可读性和维护性好。jdk6中,性能也有很大 的改进。
为了有效地控制线程间的协作,需要配合使用synchronized以及notify()和wait()等方法。
三、ReentrantLock重入锁
功能强大,可中断、可定时。使用完成后,务必释放锁。
四、ReadWriteLock读写锁
在读多写少的场合,使用读写锁可以分离读操作和写操作,使所有读操作间真正并行,因此,能够有效提高系统的并发能力。
五、Condition对象
await()方法:会使当前线程等待,同时释放当前锁,其他线程中使用signal()或者signalAll()方法时,线程会重新获得 锁并继续执行。或者当线程被中断时,也能跳出等待。
signal()方法:用于唤醒一个在等待中的线程。
六、Semaphore信号量
无论是内部锁synchronized还是重入锁ReentrantLock,一次都只允许一个线程访问一个资源,而信号量却可以指定多个线程同时访问某一个资源。
七、ThreadLocal线程局部变量
ThreadLocal完全不提供锁,而使用以空间换时间的手段,为每个线程提供变量的独立副本,以保障线程安全,因此它不是一种数据共享的解决方案。