synchronized(this)锁的是什么?同步静态方法,同步非静态方法,锁的都是什么?

1、普通同步方法,是实例锁,锁是当前实例对象。
不同的实例对象调用非静态同步方法不存在竞争关系,同一个实例对象调用非静态同步方法时存在竞争关系。注意这里是类的当前实例, 类的两个不同实例就没有这种约束了。
举例:线程A和线程B都用了同一个Student对象,Student对象有一个/多个非静态的同步方法,那么同一时刻只能有一个线程访问这些非静态同步方法,其他线程都不能访问所有的非静态的同步方法。
2、静态同步方法,是类锁,锁是当前类的Class对象。
调用静态同步方法和其他静态方法存在竞争关系,与非静态方法不存在竞争关系。
限制多线程中该类的所有实例同时访问该类所对应的静态同步方法。
举例:线程A用了Student1对象,线程B用了Student2对象,Student对象有一个/多个静态同步方法,那么同一时刻只能有一个线程访问这些静态同步方法,因为同一时刻只允许一个实例对象来访问,要么是Student1对象,要么是Student2对象,反正不能多个实例同时访问静态同步方法。
3、同步代码块,锁是Synchonized括号里配置的对象
synchronized(obj):obj称之为同步监视器,是一个Java对象

  1. 同步监视器必须是引用数据类型,不能是基本数据类型。
  2. 可以改变同步监视器堆中属性的值,但是不能改变指向堆中的地址。
  3. 尽量不要用String和包装类型作为同步监视器,容易造成指向堆中地址的变化。
  4. 一般使用共享资源作为同步监视器,也可以专门创建一个没有任何语义化含义的同步监视器。
    同步方法中无需同步监视器,因为同步方法的同步监视器就是this,即对象本身,或者说class(反射);
    同步监视器执行过程:
    线程1访问,锁定同步监视器,执行代码;
    线程2访问,同步监视器已被锁定,无法执行代码块;
    线程1访问完毕,解锁同步监视器;
    线程2访问,同步监视器未被访问,线程2锁定同步监视器,执行代码。
    synchronized(this):锁的是该方法所在类的实例对象
    当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,其他线程对object中所有synchronized(this)同步代码块的访问将被阻塞。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
    ps:不管如何加锁,都是控制都这个方法或代码块的访问,而不是整个类,这点不要忘记了。
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值