Java客户端侧锁错误

jam*_*007 0 java multithreading

我想了解客户端锁定.

我的印象是,如果我们synchronized (elements) {}按照以下代码执行操作,整个列表将被锁定,并且在线程退出监视器之前不会发生添加或删除.但我可以添加addListElement方法中的元素,我得到Exception in thread "Thread-0" java.util.ConcurrentModificationException.

客户端锁定如何在java中工作?

public class ClientLocking {

    public static void main(String args[]) {
        System.out.println("Hello World!!");
        ClientLocking c = new ClientLocking();
        c.startProcess();
    }

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

    private void startProcess() {

        addListElement("e1");
        addListElement("e2");
        addListElement("e3");

        MyThread t = new MyThread();
        t.start();

        addListElement("e4");
        addListElement("e5");
        addListElement("e6");

    }

    private void addListElement(String element) {

        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        if (elements.add(element)) {
            System.out.println("Added : " + element);
        } else {
            System.err.println("Not Added : " + element);
        }
    }

    private class MyThread extends Thread {
        @Override
        public void run() {
            try {

                synchronized (elements) {
                    Iterator<String> it = elements.iterator();
                    while (it.hasNext()) {
                        String el = it.next();
                        System.out.println("Printing : " + el);
                        Thread.sleep(500); // Some processing
                    }
                }

            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Thi*_*ilo 6

只有当所有相关代码(所有"关键部分")都在使用锁时,同步才有效.

在您的示例中,运行uses synchronized(elements),但addListElement不会.因此,它不关心您的锁定方案.

所有同步块当前都阻止两个线程同时运行"运行"(对于相同的列表).您想要了解锁的任何其他代码也必须包含同步块(具有相同的监视器对象).