Java 在使用并发API时是否需要使用synchronized

Java 在使用并发API时是否需要使用synchronized,java,multithreading,java.util.concurrent,Java,Multithreading,Java.util.concurrent,在使用并发API时是否需要使用synchronized?换句话说,这两者之间有区别吗 class消息队列{ 队列q=新的LinkedList(); 公开作废帖子(字符串消息){ 同步(q){ q、 添加(味精); } } 公共字符串get(){ 同步(q){ 返回q.poll(); } } } 这个, class MessageQueue2{ 队列q=新的ConcurrentLinkedQueue(); 公开作废帖子(字符串消息){ q、 添加(味精); } 公共字符串get(){ 返回q.p

在使用并发API时是否需要使用
synchronized
?换句话说,这两者之间有区别吗

class消息队列{
队列q=新的LinkedList();
公开作废帖子(字符串消息){
同步(q){
q、 添加(味精);
}
}
公共字符串get(){
同步(q){
返回q.poll();
}
}
}
这个,

class MessageQueue2{
队列q=新的ConcurrentLinkedQueue();
公开作废帖子(字符串消息){
q、 添加(味精);
}
公共字符串get(){
返回q.poll();
}
}
这个呢

class MessageQueue3{
队列q=新的ConcurrentLinkedQueue();
公开作废帖子(字符串消息){
同步(q){
q、 添加(味精);
}
}
公共字符串get(){
同步(q){
返回q.poll();
}
}
}

从多个线程使用并发容器是安全的。这意味着修改容器的操作将负责同步,即多个线程修改容器不会损坏它。因此,对于这种特殊用法,#1和#2在功能上是等效的,#3使用冗余同步

这并不意味着您可以使用并发容器实现任何算法并删除同步


如果算法涉及多个共享对象或同一对象上的多个操作,则即使使用并发容器,也需要一个同步块来封装所有操作。如果没有封闭的同步块,其他线程可能会并发运行并创建争用条件,即使容器是线程安全的。

读取和写入队列不必同步。如果要将队列对象替换为新对象,则只需同步。同意。我理解同步的广泛必要性(比如说一个简单的通知)。问题是关于在并发上使用
synchronized
的必要性,我想你是说它是冗余的。对于这种特殊情况,是的,它是冗余的。