synchronized同步方法,修改变量状态问题

发布于 2022-08-29 21:22:00 字数 610 浏览 11 评论 0

只有getSeq()会改变状态,理论上,使用synchronized同步的话,多线程中获取seq的值,应该是唯一的,但测试的结果,获取的seq结果,有几个数会重复。这是什么原因导致的?

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++){
            System.out.print(getSeq()+",");
        }
    }
}

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

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

发布评论

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

评论(2

妖妓 2022-09-05 21:22:00

因为你的getSeq是成员方法,synchronized锁住的是实例对象,而你在运行的时候,new出来了两个,所以就没有效果了,解决办法有两个
1.修改 getSeq() 方法,增加static修饰符
2.启动部分代码按如下修改:

    public static void main(String[] args) {
        ThreadTest tt = new ThreadTest();
        Thread t1 = new Thread(tt,"t1");
        Thread t2 = new Thread(tt,"t2");
        t1.start();
        t2.start();
    }
停顿的约定 2022-09-05 21:22:00

对的,是两个不同的对象,不能保证static变量的原子性

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