大家有时候都会碰到的问题。例如,有些代码需避免主线程阻塞需要异步处理,开子线程实现。但是开启子线程之后有可能会碰到并发资源共享的问题,所以线程与锁是紧密相关的。下面是我从网上搜索的资料总结一下java锁synchronized和Lock的一些区别,如有不当,请告知,谢谢。
一般我们会将锁分为对象锁和类锁,两个锁是有很大差别的,对象锁是作用在实例方法或者一个对象实例上面的,而类锁是作用在静态方法或者Class对象上面的。synchronized不具有继承性。
synchronized的用法
- 对象锁
对象锁是作用在实例方法或者一个对象实例上面的
作用在对象实例的方法上
pubilc synchronized void test() {}
用在对象实例的代码块上
public void test() {
synchronized(obj) {
//code
}
}
- 类锁
类锁是作用在静态方法或者Class对象上面的
pubilc synchronized static void test() {}
Lock的用法
ReentrantLock 与synchronized有相同的并发性和内存语义,还包含了中断锁等候和定时锁等候,意味着线程A如果先获得了对象obj的锁,那么线程B可以在等待指定时间内依然无法获取锁,那么就会自动放弃该锁。
synchronized是在JVM层面实现的,因此系统可以监控锁的释放与否,而ReentrantLock使用代码实现的,系统无法自动释放锁,需要在代码中finally子句中显式释放锁lock.unlock();
发现有关于Lock总结比较详细的文章,大家可以去看看:
https://www.cnblogs.com/dolphin0520/p/3923167.html
用法如下:
private Lock lock;
private void test(){
try{
lock.lock();
//code...
} catch (Exception e){
e.printStackTrace();
} finally {
lock.unlock();
}
}
总结
- 在并发量比较小的情况下,使用synchronized是个不错的选择,但是在并发量比较高的情况下,其性能下降很严重,此时ReentrantLock是个不错的方案
参考文章
https://www.cnblogs.com/benshan/p/3551987.html
https://www.cnblogs.com/wangyayun/p/6593446.html
https://blog.csdn.net/zhujiangtaotaise/article/details/55509939