不同线程通过synchronized锁对象,要想让锁达到效果,必须保证多个线程锁住的是同一个对象。
- 不要锁包装类:自动装箱使用的是valueOf方法,若没有缓存则会new一个包装对象,所以拿到的是不同对象,无法实现锁。
- 不要锁参数对象,SpringMVC在参数绑定时生成的参数对象是独立的
- 锁String字段时,要使用String.intern()返回的。该方法返回的是指向常量池的对象指针,可以保证是同一个。
对于String
String s1 = new String("jwb")//堆
String s2 = "jwb";//常量池
String s3 = s1.intern();//常量池
String s4 = "jwb"+"hello";//常量池
String s5 = s2+s4;//堆
直接写常量的指向的是常量池的,动态的拼接的,指向的是堆的。常量池的都是独一份的,因此是同一个对象,堆的就不是了。

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

被折叠的 条评论
为什么被折叠?



