package com.sample.multithread.base;
// 使用synchronized关键字加锁
public class SynchronizedDemo {
private long count = 0;
// 计数器加1
public synchronized void add(){
count++;
}
// 获取计数器的值
public synchronized long getCount(){
return count;
}
}
package com.sample.multithread.base;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
// 使用接口Lock加锁
public class LockDemo {
private long count = 0;
// Lock的接口实现类,通常使用ReentrantLock
private Lock lock = new ReentrantLock();
// 计数器加1
public void add(){
lock.lock();
try{
count++;
}finally {
lock.unlock();
}
}
// 获取计数器的值
public long getCount(){
lock.lock();
try{
return count;
}finally {
lock.unlock();
}
}
}
另外,对于synchronized关键字,在代码正常执行完成以后,线程就会自动释放锁,如果代码发生异常,或者调用对象的wait方法时,线程也会自动释放锁。
三、Lock可以通过tryLock方法判断锁的状态,而synchronized没有办法来查询锁的状态。另外,tryLock还可以指定超时时间,如果在指定的时间范围内没有获得锁,则返回false。
四、synchronized可以锁住方法和代码块,而Lock只能锁住代码块。
五、synchronized是非公平锁,且不支持公平锁,而Lock默认是非公平锁,也支持公平锁。
六、从应用场景来说,如果是简单的并发场景,使用synchronized比较适合,但对于资源竞争比较激烈,或者锁控制粒度更细的场景中,使用Lock会更合适。
下面用一个表格来总结一下两者的主区别:
都看到这里了,请帮忙一键三连啊,也就是点击文末的在看、点赞、分享,这样会让我的文章让更多人看到,也会大大地激励我进行更多的输出,谢谢!
推荐阅读:
原文始发于微信公众号(互联网全栈架构):Java中的锁:Lock和synchronized的区别
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/173559.html