开发者社区> 问答> 正文

java 多线程方法加锁获取自增变量重复问题

/**
测试多线程并发获取唯一子增长的值
@author Administrator
*
*/
public class BB {
private int increment = 0;
final static Set set = new HashSet();
final static List list = new ArrayList();
public synchronized int getauto() {
return increment++;
}
public static void main(String[] args) throws Exception {
final BB b = new BB();
Vector workers = new Vector();
for (int i = 0; i < 2; i++) {
final Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (this) {
                for (int j = 0; j < 10000; j++) {
                    int num = b.getauto();
                    System.out.println(String.valueOf(num));
                    set.add(num);
                    list.add(num);
                }
            }

        }
    });
    workers.add(t);
    t.setName("thread-" + i);
    t.start();
}
for (Thread t : workers) {
    t.join();
}
System.out.println("set  size :" + set.size());
System.out.println("list  size :" + list.size());
}
}

list和set的size不同

展开
收起
蛮大人123 2016-03-18 18:36:00 3785 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    `System.out.println("set size :" + set.size());
    System.out.println("list size :" + list.size());`
    这两句可没有在锁区域内,一个线程完毕后,在这两句执行的任意时刻,另一个线程可能已经开始执行,并改写了list.

    2019-07-17 19:07:02
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
从《阿里巴巴Java开发手册》编写推广谈技术成长 立即下载
如何通过 Serverless 提高 Java 微服务治理效 立即下载
多IO线程优化版 立即下载