synchronized的用法

synchronized

synchronized具有锁重入的功能,即一个线程需要调用对象的synchronized方法A,则获取该对象的锁,但是方法A中又调用了该对象synchronized方法B,此时对于A还没执行完锁还没释放,此时可以继续获取对象锁执行B方法,如果不支持重入则会造成死锁现象.

  1. 修饰普通方法

  • 修饰普通方法时,拿到的是对象锁,比如,synchronized修饰方法A,若多个线程调用同一个对象的A方法时需要排队按顺序进行调用,如果是不同对象的A方法则可以异步调用.
  • 若对象object中有两个synchronized方法A和B,当一个线程调用object.A()时另一个线程想要调用object.B()需要等A执行完毕之后,因为拿到的是对象锁,而对象包含AB两个方法
  1. 修饰静态方法,修饰类:修饰静态方法和修饰类都是拿到的类锁,将类模板锁定

  • 修饰静态方法和普通方法的区别是一个拿的是类锁一个是对象锁,若对象object中有synchronized修饰的静态方法A和普通方法B,那个这两个方法虽然都有synchronized但是是异步执行的,因为一个是类锁一个是对象锁.
  • 若一个对象中两个synchronized修饰的静态方法那么这两个静态方法需要排队执行,因为都使用类锁
  1. 修饰代码块:在某些情况下,我们编写的方法体可能比较大,同时存在一些比较耗时的操作,而需要同步的代码又只有一小部分,如果直接对整个方法进行同步操作,可能会得不偿失,此时我们可以使用同步代码块的方法对需要同步的代码进行包裹,这样就无需对整个方法进行同步操作了,也就是通常所说的减少锁的粒度

  • synchronized(this):为部分代码块加了对象锁,相当于给普通方法加synchronized的效果.
  • synchronized(object):
    • 若多个线程同时执行synchronized(object)则同步,若分别执行synchronized(object1)和synchronized(object2)则异步执行
    • 多个线程分别执行synchronized(object)修饰的代码块和synchronized(object)修饰的方法,若为同一个对象则同步执行否则异步执行
    • 多个线程分别执行synchronized(this)修饰的代码块和synchronized(object)修饰的方法,若为同一个对象则同步执行否则异步执行
  • synchronized(*.class):拿到的是类锁,例如synchronized(A.class),多个线程操作A类同一对象时同步操作,多个线程操作A类的不同对象时也是同步操作,因为是类锁.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值