1,线程间的共享和协作
内置锁
多线程访问同一对象 需要synchronized 保证可见性和排他性
对象锁和类锁
锁对象,锁class对象(唯一),static方法
2,等待/通知机制
notify() 通知一个,不确定具体
notifyAll()所有 ,一般都用这个
调用wait()方法后,会释放对象的锁
模型
等待方遵循如下原则。
1)获取对象的锁。
2)如果条件不满足,那么调用对象的wait()方法,被通知后仍要检查条件。
3)条件满足则执行对应的逻辑。
synchronized (对象){
while(条件不满足){
对象.wait()
}
对应逻辑
}
通知方遵循如下原则。
1)获得对象的锁。
2)改变条件。
3)通知所有等待在对象上的线程。
synchronized (对象){
改变条件
对象.notifyAll()
}
3,ThreadLocal 线程变量
ThreadLocal对象为键、任意对象为值
变量线程隔离
4,显式锁 Lock
核心方法
lock.lock();
try{
count++;
}finally{
lock.unlock();
}
lockInterruptibly():可中断的获取锁,获取锁的过程中中断线程
tryLock():尝试非阻塞的获取锁 返回boolean
tryLock(time)超时获取锁,
5,可重入锁ReentrantLock、所谓锁的公平和非公平
ReentrantLock在调用lock()方法时,已经获取到锁的线程,能够再次调用lock()方法获取锁而不被阻塞。
公平锁 先对锁进行获取的请求一定先被满足 反之不公平
非公平效率高(公平锁切换上下文耗时)
6,读写锁ReentrantReadWriteLock(非排他锁,可同时被多个线程访问)
写线程访问,其他线程阻塞
7,Condition 与Lock配合 类似Object中wait synchronized配合
实现等待/通知模式
private Condition cond = lock.newCondition();
cond.await()/cond.slgnalAll()
8,Volatile 可见的,易变的
变量是不稳定 可能主存,本地内存不一致