关系性锁:
Lock:
锁可以保证线程的执行是安全的,使线程在执行时,只有执行完一个线程才能执行其他线程。任何时刻只有一个线程才能进入临界区,一旦一个线程封锁了锁对象,其他线程将无法通过lock语句。锁是可重入的,线程可以重复获得持有的锁。锁保持一个持有计数来跟踪锁的嵌套调用。每一次调用lock都要调用unlock来释放锁。
1、基本步骤
Lock myLock = new ReentrantLock();
public void method(){
myLock.lock();
try{
……..
}
finally{
myLock.unlock();
}
2、条件对象
当线程在执行前会获得一个条件对象,此时会判断该线程在执行时,会判断是否符合条件,如果不符合执行条件,会进入阻塞队列,等待其他线程执行其他程序,使阻塞队列的线程唤醒。唤醒之后,退出同步方法。
public Class LockTest{
Lock myLock = ReentrantLock();
Condition sufficient = myLock.newCondition();
public void method(){
myLock.lock();
try{
while(条件){
sufficient.await();
}
………
sufficient.signalAll();
}
finally{
myLock.unlock();
}
}
synchronized关键字:
synchronized是一个内部锁,每一个对象都含有该锁,同时可以使用wait()来阻塞不符合条件的线程,使用notifyAll解除所有阻塞的锁。
使用步骤:
public void synchronized method(){
while(条件){
wait();
}
…….
notifyAll();
}
读/写锁:
写锁只允许一个线程在操作,读锁允许所有读线程进行操作。
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
Lock read = lock.readLock();
Lock write = lock.writeLock();