synchronized加锁对象有什么要求?

不同线程通过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;//堆

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

你可能感兴趣的:(java,并发)