由于c已经是同步集合,因此它是线程安全的。但为什么我们必须再次使用synchronized(c)进行迭代?真的很困惑。谢谢。"用户必须手动同步返回的迭代时的集合:Collectionc=Collections.synchronizedCollection(myCollection);...synchronized(c){Iteratori=c.iterator();//Mustbeinthesynchronizedblockwhile(i.hasNext()){foo(i.next());}}不遵循此建议可能会导致不确定的行为。“http://docs.oracle.com/javas
synchronized不是方法签名的一部分。但是当我们覆盖一个方法时,决定被覆盖的方法是否编译的不仅仅是方法签名。例如,我们不能添加或扩大检查异常为什么synchronized在多态性中没有作用。一个synchronized方法不应该在没有放置synchronized的情况下被覆盖。因为使用父类(superclass)变量的人可能认为所有方法都是线程安全的。但非同步方法应该允许被synchronized覆盖,因为它增加了更多的功能,但另一方面用户不会遇到任何错误,除了时间延迟。我正在寻找一个合乎逻辑的解释,它可以阐明“为什么这样设计”。 最佳答案
为了避免竞争条件,我们可以同步共享变量的写入和访问方法,将这些变量锁定到其他线程。我的问题是是否有其他(更好的)方法来避免竞争条件?锁使程序变慢。我发现的是:如果只有一个共享变量,则使用Atomic类。为多个共享变量使用不可变容器,并使用volatile声明此容器对象。(这个方法是从《JavaConcurrencyinPractice》一书中找到的)我不确定它们是否比同步方式执行得更快,还有其他更好的方法吗?谢谢 最佳答案 回避状态。尽可能使您的应用程序无状态。每个线程(Action序列)应该在开始时采用一个上下文,并使用这个上下文
我使用sunjdk1.5ThreadPoolExecutor(24,24,60,TimeUnit.SECONDS,newLinkedBlockingQueue())。soemtime我用jdb工具发现线程池中所有线程的状态都是“waitinginamonitor”,代码是:Stringkey=getKey(dt.getPrefix(),id);synchronized(key.intern()){----->“synchronized(key.intern())”有问题吗?我使用jdb工具得到以下信息,24个线程的状态是“waitinginamonitor”,这意味着24个线程在“ke
我的Java应用程序使用两个线程。从历史上看,有同步方法和专用锁对象在使用中。我需要知道当前线程是否有锁,是通过方法还是通过对象。我该怎么做? 最佳答案 当进入同步方法时,VM会在当前对象上设置一个锁。因此下面的代码具有相同的效果:synchronizedvoidsyncMethod(){//dosomething}voidsyncManually(){synchronized(this){//dosomething}}这意味着同步方法与synchronized(lock){//dosomething}代码中的任何位置。您可以使用T
我想我知道这一点,但希望得到证实。显然synchronized会阻止其他线程访问它,但我看到了很多例子,例如publicsynchronizedvoidsetValue(intvalue){balance=value;}我的想法是否正确,如果方法像上面那样只执行一行,那么同步就没有意义了。谢谢 最佳答案 AmIrightinthinking,thatifthemethodonlydoesonelineliketheabove,thenthereisnopointinitbeingsynchronized.没有。您似乎认为同步仅意味着
在我编写的项目中,我需要从函数返回一个线程安全且不可变的View。但是,我不确定这一点。由于synchronizedList和unmodifiableList只是返回列表的View,我不知道是否Collections.synchronizedList(Collections.unmodifiableList(this.data));会成功的。谁能告诉我这是否正确,如果不正确,是否存在任何可能失败的情况?感谢您的任何意见! 最佳答案 我发现这是JDK中的真正差距。幸运的是,一个由JavaCollections设计师领导的Google团
我的问题是关于synchronizedList方法集合类。Javadocs说:用户在遍历返回的列表时必须手动同步它:Listlist=Collections.synchronizedList(newArrayList());...synchronized(list){Iteratori=list.iterator();//Mustbeinsynchronizedblockwhile(i.hasNext())foo(i.next());}虽然其他方法不需要手动同步。我查看了Collections类的源代码并且发现同步化已经针对所有方法进行了处理,例如addpublicbooleanadd
我有一个关于同步列表的一般性问题。可以说在构造函数中我正在创建一个列表ListsynchronizedList=Collections.synchronizedList(list);我有一个方法可以将一个对象添加到列表中。publicvoidadd(Strings){synchronizedList.add(s)}还有另一个线程每隔几秒检查一次是否有几行,将其转储到一个文件并全部删除。现在假设我迭代每一行并将其保存到数据库中。在所有迭代之后,我清除了列表。多线程支持对我有何帮助?我可以在另一个线程中的clear()发生之前向列表中添加一个元素。除非我自己管理锁(我真的不需要同步列表)它
我有以下类型的代码:synchronizedblock1{//onlyonethreadintheblock}{lotofcodewheresynchronizationnotnecessary}synchronizedblock2{//onlyonethreadintheblock.//Allthethreadsthatexecutedblock1beforethisthreadshouldhavealreadyexecutedthisblock.}每个线程首先以相同的顺序执行block1、非同步块(synchronizedblock)和block2。如果线程T1在线程T2之前执行b