java多线程同步问题

小小丁灬 发布于 2016/10/17 17:29
阅读 166
收藏 0

项目中有个地方需要同步,service中的方法会传入一个 orderId  ,用这个orderId作为锁对象,感觉有点问题,认为不会同步.

public void print(String id){
		try {
			synchronized (orderId) {
				Thread.sleep(5000);
				System.out.println(orderId+"   " +System.currentTimeMillis());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}



但是自己在测试的时候,都传入100,两个线程时间差在5秒.

求高手解惑.


加载中
0
ksfzhaohui
ksfzhaohui
String值相同,并不一定是同一个对象,对象都不确定是不是同一个对象,当然有问题
小小丁灬
我一开始也是这么想的.但是我自己测试,url相同,2个页面同时刷新(很快速的点),打印出来的时间差是5030毫秒左右,好多次都是这样.
0
kakai
kakai
orderId是字符串?固定内存地址的对象才可以作为锁参数,要将String类型作为锁参数,一般要把这个变量定义为static、final来限制这个对象不能被修改,内存地址保持不变。
小小丁灬
我一开始也是这么想的.但是我自己测试,url相同,2个页面同时刷新(很快速的点),打印出来的时间差是5030毫秒左右,好多次都是这样.
0
M
Minute
加个intern() 就可以同步了
M
Minute
回复 @小小丁灬 : 是的 测试也不是通过点击 需要写一个多线程的程序调用
小小丁灬
synchronized (orderId.intern()) 这样?
0
皮皮狗

string 是不可变类 像你这种写法 每次加锁的对象都不一样 所以相当于没用了

0
whaon
whaon

引用来自“Minute”的评论

加个intern() 就可以同步了
正解
返回顶部
顶部