Tag: synchronized

同步死锁(String intern())

我用户sun jdk 1.5 ThreadPoolExecutor(24,24,60,TimeUnit.SECONDS,new LinkedBlockingQueue())。 soemtime我用jdb工具查找线程池中所有线程的状态是“在监视器中等待”,代码是: String key = getKey(dt.getPrefix(), id); synchronized (key.intern()) { —–> “synchronized(key.intern())”中有问题吗? 我使用jdb工具跟踪informatnio,24个线程的状态是“在监视器中等待”,这意味着24个线程在“key.intern()”处于死锁状态。 (java.lang.Thread)0x28 pool-3-thread-2在监视器中等待 (java.lang.Thread)0x27 pool-3-thread-3在监视器中等待 (java.lang.Thread)0x1b pool-3-thread-4在监视器中等待 (java.lang.Thread)0x1a pool-3-thread-5在监视器中等待 (java.lang.Thread)0x19 pool-3-thread-6在监视器中等待 (java.lang.Thread)0x18 pool-3-thread-7在监视器中等待 (java.lang.Thread)0x17 pool-3-thread-8在监视器中等待… 所以结果是:在multithreading环境中,Sting intern()方法可能是死锁,好吗?

如何在Java中返回线程安全/不可变的集合?

在我编写的项目中,我需要从函数返回一个线程安全且不可变的视图。 但是,我不确定这一点。 由于synchronizedList和unmodifiableList只返回列表的视图,我不知道是否 Collections.synchronizedList(Collections.unmodifiableList(this.data)); 会做的伎俩。 任何人都可以告诉我这是否正确,如果不是,有什么情况可能会失败吗? 感谢您的任何投入!

Java 7 Calendar.getInstance,TimeZone.getTimeZone得到同步和缓慢,任何解决方法?

在将我的运行时升级到Java 7后,我看到了令人难以置信的缓慢……我的程序将所有时间都花在SimpleDateFormat构造函数中。 正如一篇很棒的post所述: http : //coffeedriven.org/? TimeZone = 83 , TimeZone代码现在正在检查static synchronized方法getDefaultInAppContext()是否存在应用程序上下文。 对我来说问题是它是Spring Batch文件阅读器代码,它为它读取的每一行创建一个new SimpleDateFormat对象! 有人为此工作吗?

java中的同步重新排序

众所周知,JVM不应该将带有同步块的语句重新排序到同步块之外。 考虑到这一点,是否允许JVM重新排序赋值y = 7以便在以下代码段中的synchronized块之后发生? x = 5; y = 7; synchronized (this) { x = 6; } 我们知道在同步块之前的变量赋值可以重新排序以在块内发生。 所以以下内容应该是初始代码的有效重新排序: x = 5; synchronized (this) { x = 6; y = 7; } 有人可能会争辩说,因为这是一个有效的排序,所以在synchronized块之后不会发生y赋值,因为它违反了同步块内的代码不能在块之后重新排序并推断y 发生的规则 – 在结束之前同步块的。 另一方面,可能所有的排序都不等同,重要的是哪个排序是实际排序。 具体来说,如果y赋值最初是在同步块内完成的,则在块之后不会发生,否则就可能发生。 总结一下,接下来是订购第一个片段的有效排序吗? x = 5; synchronized (this) { x = 6; } y = 7;

为什么调用方法的Java字节码隐式获取和释放监视器?

我一直在阅读Java虚拟机指令集,并注意到当使用指令调用标记为同步的方法(例如invokestatic,invokevirtual等)时,由特定的字节码指令来获取接收器上的监视器宾语。 类似地,从方法返回时,由方法同步时指令释放监视器的指令。 这看起来很奇怪,因为有明确的monitorenter和monitorexit字节码来管理监视器。 JVM是否有特殊原因以这种方式设计这些指令,而不是仅仅编译方法以在适当的位置包含monitorenter和monitorexit指令?

ConcurrentModificationException甚至在LinkedHashMap上使用Collections.sychronizedMap

我在我的类中使用了一个Map对象,我已经与LinkedHashMap的Collections.synchronizedMap()同步,如下所示: private GameObjectManager(){ gameObjects = Collections.synchronizedMap(new LinkedHashMap()); } 我在这个函数的第三行得到一个并发修改exception: public static void frameElapsed(float msElapsed){ if(!INSTANCE.gameObjects.isEmpty()){ synchronized(INSTANCE.gameObjects){ for(GameObject object : INSTANCE.gameObjects.values()){…} } } } 我正在迭代Map的所有其他位置,我按照文档在地图上进行同步。 我的类中还有其他函数使用这个Map(同步的!)和put()和remove()对象,但这应该不重要。 我究竟做错了什么? 请询问更多代码,不知道还有什么要放。 哦,和日志消息: 08-20 15:55:30.109: E/AndroidRuntime(14482): FATAL EXCEPTION: GLThread 1748 08-20 15:55:30.109: E/AndroidRuntime(14482): java.util.ConcurrentModificationException 08-20 15:55:30.109: E/AndroidRuntime(14482): at java.util.LinkedHashMap$LinkedHashIterator.nextEntry(LinkedHashMap.java:350) 08-20 15:55:30.109: E/AndroidRuntime(14482): at java.util.LinkedHashMap$ValueIterator.next(LinkedHashMap.java:374) 08-20 15:55:30.109: E/AndroidRuntime(14482): at package.GameObjectManager.frameElapsed(GameObjectManager.java:247) 08-20 […]

同步值,而不是对象

我想在Java中做这样的事情 public void giveMoney(String userId, int money) { synchronized (userId) { Profile p = fetchProfileFromDB(userId); p.setMoney(p.getMoney() + userId); saveProfileToDB(p); } } 但是,当然,对字符串进行同步是不正确的。 做这样的事情的正确方法是什么?

原始类型的易失性或同步?

在Java中,如果变量的大小小于或等于32位,则赋值是primefaces的,但如果大于32位则不是。 在双重或长期分配的情况下,使用什么(易失性/同步)会更有效? 喜欢, volatile double x = y; synchronized不适用于原始参数。 在这种情况下如何使用synchronized? 当然我不想锁定我的课程,所以不应该使用它。

是否需要将ConcurrentHashMap包装在同步块中?

在ConcurrentHashMap( put() , remove()等)上的所有非retreival操作是否需要包装在synchronized(this)块中? 我知道所有这些操作都是线程安全的,所以这样做有什么好处/需要吗? 使用的唯一操作是put()和remove() 。 protected final Map mapDataStore = new ConcurrentHashMap(); public void updateDataStore(final String key, final String value) { … synchronized (this) { mapDataStore.put(key, value); } … }

Java RMI和线程同步问题

我实际上有两个关于Java RMI和线程同步的问题: 1)如果我将RMI远程方法实现为同步,它们是否保证互斥? 我需要确保没有两个我的RMI方法(提供给客户端的方法)同时执行。 2)我有一个服务器定期执行的方法。 它用于清理。 当远程客户端运行/使用任何RMI方法时,我必须确保不执行此特定方法。 此外,当该方法运行时,不应该进行RMI调用。 即客户必须等待。 知道我怎么能这样做吗? 我读过有关Locks的内容,但我不知道如何在这种情况下使用它们。 我已经考虑过将RMI方法实现为静态并在RMI接口中包含清理方法,但它似乎并不是解决问题的优雅方法。 我还将RMI接口内的清理方法编写为synchronized。 当我运行它进行测试时,方法之间似乎没有冲突,但我无法确定。 谢谢你的时间和答案。