java锁使用总结

一.加锁方式 1.synchronized修饰方法    

public synchronized void  synMethod() {...}//锁为所在类的对象

或者

public static synchronized void  synMethod() {...}//锁为所在类的class对象

2.synchronized代码块,所在的类的对象做为锁

synchronized(this){...}

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();

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();

    原文作者:java锁
    原文地址: https://blog.csdn.net/kusedexingfu/article/details/79056298
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞