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();//如果一个线程调用这个方法不能获取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();
 
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值