Java-synchronized 获取序列值不唯一

发布于 2016-12-03 13:08:37 字数 691 浏览 1162 评论 1

理论上,通过synchronized修饰的方法,应该只用一条线程能访问。这样通过getSeq()得到的值应该是不重复自增的。但是测试的结果,中间会有几个重复值。这个是因为什么导致的?测试使用jdk1.6

public class ThreadTest implements Runnable {
private static int seq;
public synchronized int getSeq(){
return seq++;
}
public static void main(String[] args) {
Thread t1 = new Thread(new ThreadTest(),"t1");
Thread t2 = new Thread(new ThreadTest(),"t2");
t1.start();
t2.start();
}
@Override
public void run() {
for(int i = 0;i<100000;i++){
int s = getSeq();
System.out.print(s+",");
}
}


}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

虐人心 2017-07-09 07:07:45

在7,8行你建了两个ThreadTest, synchronized方法是根据对像(this)来上锁的,所以你有两个锁,没有起到同步的作用。

public class ThreadTest implements Runnable {
private static int seq;
private static Object lock = new Object();

public int getSeq(){
synchronized (lock) {
return seq++;
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new ThreadTest(),"t1");
Thread t2 = new Thread(new ThreadTest(),"t2");
t1.start();
t2.start();
}
@Override
public void run() {
for(int i = 0; i < 100000; i++) {
int s = getSeq();
System.out.print(s+"n");
}
}

}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文