synchronized加锁对象有什么要求?

本文探讨了Java中synchronized关键字的正确使用方法,强调了为了实现有效的线程同步,多个线程必须锁定同一对象的重要性。文章还详细解释了在使用String、包装类和参数对象作为锁时的常见误区,以及如何避免这些问题。

不同线程通过synchronized锁对象,要想让锁达到效果,必须保证多个线程锁住的是同一个对象。

  1. 不要锁包装类:自动装箱使用的是valueOf方法,若没有缓存则会new一个包装对象,所以拿到的是不同对象,无法实现锁。
  2. 不要锁参数对象,SpringMVC在参数绑定时生成的参数对象是独立的
  3. 锁String字段时,要使用String.intern()返回的。该方法返回的是指向常量池的对象指针,可以保证是同一个。

对于String

String s1 = new String("jwb")//堆
String s2 = "jwb";//常量池
String s3 = s1.intern();//常量池
String s4 = "jwb"+"hello";//常量池
String s5 = s2+s4;//堆

直接写常量的指向的是常量池的,动态的拼接的,指向的是堆的。常量池的都是独一份的,因此是同一个对象,堆的就不是了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值