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)
只有当所有相关代码(所有"关键部分")都在使用锁时,同步才有效.
在您的示例中,运行uses synchronized(elements),但addListElement不会.因此,它不关心您的锁定方案.
所有同步块当前都阻止两个线程同时运行"运行"(对于相同的列表).您想要了解锁的任何其他代码也必须包含同步块(具有相同的监视器对象).