一.加锁方式
1.synchronized修饰方法
public synchronized void synMethod() {...}//锁为所在类的对象
或者
public static synchronized void synMethod() {...}//锁为所在类的class对象
2.synchronized代码块,所在的类的对象做为锁
3.synchronized代码块,对象锁
synchronized(某类的实例对象){...}
4.ReentrantLock
Lock lock=new ReentrantLock();//可以传入true或者false表示是否公平
lock.lock();
...
lock.unlock();
或者
Lock lock=new ReentrantLock();//可以传入true或者false表示是否公平
lock.tryLock();//如果一个线程调用这个方法不能获取Lock接口的控制权时,将会立即返回并且不会使这个线程进入等待。
...
lock.unlock();
//如果一个线程调用这个方法不能获取Lock接口的控制权时,将会立即返回并且不会使这个线程进入等待。
...
lock.unlock();
5. ReentrantReadWriteLock
读锁,同时可以有多个线程执行读操作:
ReadWriteLock lock = new ReentrantReadWriteLock();//可以传入true或者false表示是否公平
lock.readLock().lock();
...
lock.readLock().unlock();
写锁,只有一个线程可以执行写操作:
ReadWriteLock lock = new ReentrantReadWriteLock();//可以传入true或者false表示是否公平
lock.readLock().lock();
...
lock.readLock().unlock();
当然,读锁和写锁也可以调用tryLock()
二.等待/唤醒机制
1.synchronized中的等待/唤醒机制
public synchronized void synMethod() {...}{
wait();
...
notify();//或者notifyAll();
}
public static synchronized void synMethod() {...}{
该类名.class.wait();
...
该类名.class.notify();//或者notifyAll();
}
synchronized(某类的实例对象o){
o.wait();
...
o.notify();//或者notifyAll();
}
wait()支持参数
如果在synchronized代码块外部调用wait()方法,JVM会抛出IllegalMonitorStateException异常。
为了唤醒线程,你必 须在由相同对象保护的synchronized代码块中调用notify()或notifyAll()方法。
notify()和notifyAll()方法并不保证线程会醒来,
notify()不会立刻立刻释放sycronized(obj)中的obj锁,必须要等notify()所在线程执行完synchronized(obj)块中的所有代码才会释放这把锁.
2.ReentrantLock和ReentrantReadWriteLock的等待/唤醒机制
ReentrantLock等待/唤醒机制
Lock lock = new ReentrantLock();
lock.lock();
...
Condition condition = lock.newCondition();
condition.await();
...
condition.signal();//或者signalAll();
...
lock.unlock();
ReentrantReadWriteLock的等待/唤醒机制
ReentrantReadWriteLock wrLock = new ReentrantReadWriteLock();
wrLock.writeLock().lock();
...
Condition wCondition = wrLock.writeLock().newCondition();
...
wCondition.await();
...
wCondition.signal();//或者signalAll();
...
wrLock.writeLock().unlock();
读锁同样适用。
synchronized中的等待/唤醒机制的注意事项对其也适用
ReentrantLock和ReentrantReadWriteLock的Condition支持condition.awaitUntil(deadline)和condition.awaitUninterruptibly();