synchronized 和 Lock用法

大家有时候都会碰到的问题。例如,有些代码需避免主线程阻塞需要异步处理,开子线程实现。但是开启子线程之后有可能会碰到并发资源共享的问题,所以线程与锁是紧密相关的。下面是我从网上搜索的资料总结一下java锁synchronizedLock的一些区别,如有不当,请告知,谢谢。

一般我们会将锁分为对象锁类锁,两个锁是有很大差别的,对象锁是作用在实例方法或者一个对象实例上面的,而类锁是作用在静态方法或者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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值