开发者社区 问答 正文

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

只有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()+",");
        }
    }
}

展开
收起
蛮大人123 2016-02-29 16:10:11 2470 分享 版权
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    因为你的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();
        }
    2019-07-17 18:50:28
    赞同 1 展开评论
问答地址: