1

我同步了下面的代码,但是会导致并发问题。

我知道这是由多线程引起的,我被synchronized关键字弄糊涂了。我预计list.length值为 100。我该如何解决?

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class ThreadA extends Thread {

    private static byte[] lock = new byte[0];

    private static final List<String> list = new ArrayList<String>();

    @Override
    public void run() {

        System.out.println(list.size());

        synchronized(lock) {
            int size = list.size();
            if( size == 0 ) return;

            if(size >= 100) {
                list.clear();
            }
        }

    }

    public void add(String s) {
        list.add(s);
    }

    public static void main(String[] args) {

        for(int i = 0; i < 100; i++) {
            new ThreadA().start();
            new Thread(new Runnable() {

                @Override
                public void run() {
                    synchronized(lock) {
                        for(int m = 0; m < 100; m++) {
                            list.add(new Date().toLocaleString());
                        }
                    }
                }
            }).start();
        }

        System.out.println("LIST.SIZE:" + list.size());
    }

}
4

1 回答 1

2

两个问题:

  1. println 访问list时无需同步且无需等待线程完成。你会得到那个时候 list 的任何值。

  2. 无法保证线程将以什么顺序执行。可能会发生所有ThreadA实例在匿名线程之前运行的情况,结果可能会显着超过 100。

于 2013-06-08T15:42:11.217 回答