Skip to content

当我尝试用synchronized去锁一个Integer的静态变量时,在多线程下发生了线程不安全问题,原因是synchronized锁住的Integer静态变量在不断发生变化,即i++会不断创建新的Integer,然后致使多线程下锁的不是一个对象,锁无效(以下代码在-128~127之间是有效的,因为存在Integer缓存问题)。

public class Main {
    private static Integer i = 0;
    public static void main(String[] args) throws InterruptedException {
        List<Thread> list = new ArrayList<>();
        for (int j = 0; j < 2; j++) {
            Thread thread = new Thread(() -> {
                for (int k = 0; k < 127; k++) {
                    synchronized (i) {
                        i++;
                    }
                }
            }, "" + j);
            list.add(thread);
        }
        list.stream().forEach(t -> t.start());
        list.stream().forEach(t -> {
            try {
                t.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        System.out.println(i);
    }
}

Released under the MIT License.