在解决生产者消费者问题时,我偶然发现了一种情况,其中我可以在字段“ sharedLinkedList”或类“ SharedObject”的整个对象“ this”上进行同步。“ sharedLinkedList”是生产者和消费者线程将要处理的字段。
请使用Produce方法找到该类的片段:-
public class SharedObject {
LinkedList<Integer> sharedLinkedList = new LinkedList<Integer>();
int capacity = 5;
public void produce() {
while (true) {
synchronized (sharedLinkedList) {// Alternately synchronized(this)
try {
while(sharedLinkedList.size() == capacity){
sharedLinkedList.wait();//Alternately this.wait()
}
} catch (InterruptedException e) {
e.printStackTrace();
}
sharedLinkedList.add(123);
sharedLinkedList.notify();//Alternately this.notify
}
}
}
}
两种方法都起作用。
1。在字段“ sharedLinkedList”上同步]2。同步整个对象(在代码段中作为注释)。
哪种方法更好,为什么?
使用您显示的代码量,两种方法是等效的。这并不意味着它们在所有情况下都是等效的。
synchronized(x)
设置x
的锁定,因此通常,应该使用共享资源使用所有线程共用的对象进行同步。如果线程使用单个公共资源(例如列表),则在该列表上进行同步即可。如果线程共享多个资源,则必须在单独的对象上进行同步以控制对这些共享资源的访问。根据上下文,它可以是一个对象,也可以是this
。
[synchronized(this)
还防止在类的方法之间相互排斥,因此,如果需要以线程安全的方式修改对象状态,则同步方法非常有用。