我正在为多个玩家(线程)同时移动的游戏建模。玩家当前所在位置的信息被存储了两次:玩家有一个变量“hostField”,它引用了棋盘上的一个字段,每个字段都有一个ArrayList存储当前位于该字段的玩家。我对我有冗余信息这一事实不太满意,但我发现如果不循环访问大型数据集,就无法避免这种情况。但是,当玩家从一个field移动到另一个field时,我想确保(1)冗余信息保持关联(2)目前没有其他人在操纵该field。因此我需要做类似的事情synchronized(player,field){//code}这是不可能的,对吧?我该怎么办?:) 最佳答案
我在Java中有这段代码:publicvoiddoSomeThing(){synchronized(this){doSomeThingElse();}}publicvoiddoSomeThingElse(){synchronized(this){//dosomethingelse}}这个代码可以阻塞吗?我的意思是,这段代码可以一直等待吗? 最佳答案 作为javadocumentationdescribes对于可重入锁定:athreadcanacquirealockthatitalreadyowns第二个同步块(synchronize
我在Java中有这段代码:publicvoiddoSomeThing(){synchronized(this){doSomeThingElse();}}publicvoiddoSomeThingElse(){synchronized(this){//dosomethingelse}}这个代码可以阻塞吗?我的意思是,这段代码可以一直等待吗? 最佳答案 作为javadocumentationdescribes对于可重入锁定:athreadcanacquirealockthatitalreadyowns第二个同步块(synchronize
我对线程的概念仍然很陌生,并尝试更多地了解它。最近,我在WhatVolatileMeansinJava上看到了一篇博文。杰里米·曼森(JeremyManson)写道:Whenonethreadwritestoavolatilevariable,andanotherthreadseesthatwrite,thefirstthreadistellingthesecondaboutallofthecontentsofmemoryupuntilitperformedthewritetothatvolatilevariable.[...]allofthememorycontentsseenbyT
我对线程的概念仍然很陌生,并尝试更多地了解它。最近,我在WhatVolatileMeansinJava上看到了一篇博文。杰里米·曼森(JeremyManson)写道:Whenonethreadwritestoavolatilevariable,andanotherthreadseesthatwrite,thefirstthreadistellingthesecondaboutallofthecontentsofmemoryupuntilitperformedthewritetothatvolatilevariable.[...]allofthememorycontentsseenbyT
我想知道在Java中如果我在同一个对象上同步两次是否会出现任何奇怪的行为?场景如下pulbicclassSillyClassName{objectmoo;...publicvoidmethod1(){synchronized(moo){....method2();....}}publicvoidmethod2(){synchronized(moo){doStuff();}}}两种方法都使用对象并在其上同步。第二个方法被第一个方法调用时会因为被锁定而停止吗?我不这么认为,因为它是同一个线程,但我不确定可能会出现任何其他奇怪的结果。 最佳答案
我想知道在Java中如果我在同一个对象上同步两次是否会出现任何奇怪的行为?场景如下pulbicclassSillyClassName{objectmoo;...publicvoidmethod1(){synchronized(moo){....method2();....}}publicvoidmethod2(){synchronized(moo){doStuff();}}}两种方法都使用对象并在其上同步。第二个方法被第一个方法调用时会因为被锁定而停止吗?我不这么认为,因为它是同一个线程,但我不确定可能会出现任何其他奇怪的结果。 最佳答案
我们有多个线程在ArrayList上调用add(obj)。我的理论是,当两个线程同时调用add时,只有被添加的两个对象中的一个真正添加到ArrayList。这合理吗?如果是这样,你如何解决这个问题?使用像Vector这样的同步集合? 最佳答案 当ArrayList上的两个线程同时调用add时,没有保证会发生什么行为。但是,根据我的经验,这两个对象都被很好地添加了。大多数与列表相关的线程安全问题都在添加/删除时处理迭代。尽管如此,我强烈建议不要使用具有多线程和并发访问的vanillaArrayList。Vector曾经是并发列表的标准
我们有多个线程在ArrayList上调用add(obj)。我的理论是,当两个线程同时调用add时,只有被添加的两个对象中的一个真正添加到ArrayList。这合理吗?如果是这样,你如何解决这个问题?使用像Vector这样的同步集合? 最佳答案 当ArrayList上的两个线程同时调用add时,没有保证会发生什么行为。但是,根据我的经验,这两个对象都被很好地添加了。大多数与列表相关的线程安全问题都在添加/删除时处理迭代。尽管如此,我强烈建议不要使用具有多线程和并发访问的vanillaArrayList。Vector曾经是并发列表的标准
如果多个线程在没有同步的情况下调用System.out.println(String),输出可以交错吗?还是每一行的写入都是原子的?API没有提到同步,所以这似乎是可能的,还是缓冲和/或VM内存模型等阻止了交错输出?编辑:例如,如果每个线程包含:System.out.println("ABC");保证输出是:ABCABC或者可能是:AABCBC 最佳答案 由于API文档没有提及System.outobject上的线程安全性。PrintStream#println(String)method也没有你不能假设它是线程安全的。然而,一个特