草庐IT

synchronization

全部标签

Java:是否所有静态方法都需要同步?

我有一个friend说,在JavaWeb应用程序的上下文中,所有静态方法都应该同步。真的吗?我已经阅读了许多其他关于此的堆栈溢出页面。我逐渐相信,只有在满足以下条件时才需要同步:多线程(如在带有线程池的Sevlet容器中)单个类加载器线程间的共享数据,无论是Session数据还是静态成员数据。共享数据必须是可变的。只读数据可以共享。基于此我认为应该同步静态成员,而不是静态方法。importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;publicclassThreadTest{stat

java - 如何检查线程是否在同步块(synchronized block)或方法内?

我的Java应用程序使用两个线程。从历史上看,有同步方法和专用锁对象在使用中。我需要知道当前线程是否有锁,是通过方法还是通过对象。我该怎么做? 最佳答案 当进入同步方法时,VM会在当前对象上设置一个锁。因此下面的代码具有相同的效果:synchronizedvoidsyncMethod(){//dosomething}voidsyncManually(){synchronized(this){//dosomething}}这意味着同步方法与synchronized(lock){//dosomething}代码中的任何位置。您可以使用T

java - Java同步HashMap中的size()、put()、remove()、get()是原子的吗?

我将JavaMap声明为Mapmap=Collections.synchronizedMap(newHashMap());处理并发问题,对map上的所有操作进行同步。但是,我读到当操作是原子操作时,同步在synchronizedMap上不是必需的。我检查了JavaAPI,HashMap的文档似乎没有提到哪些是原子的,所以我不确定哪些是原子的。我正在同步对map的以下调用:map.size()map.put()map.remove()map.get()但是如果有些是原子的,那么似乎不需要同步。哪些是原子的? 最佳答案 同步map顾名思

Java:惰性初始化单例

创建单例的模式似乎是这样的:publicclassSingleton{privatestaticfinalSingletoninstance=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returninstance;}}但是我的问题是,如果SingletonConstructor做了一些对单元测试不友好的事情,例如调用外部服务、jndi查找等。我想我可以像这样重构它:publicclassSingleton{privatestaticSingletoninstance;privateSing

java - 在可以避免的情况下需要在迭代时手动同步 Synchronized 列表吗?

我的问题是关于synchronizedList方法集合类。Javadocs说:用户在遍历返回的列表时必须手动同步它:Listlist=Collections.synchronizedList(newArrayList());...synchronized(list){Iteratori=list.iterator();//Mustbeinsynchronizedblockwhile(i.hasNext())foo(i.next());}虽然其他方法不需要手动同步。我查看了Collections类的源代码并且发现同步化已经针对所有方法进行了处理,例如addpublicbooleanadd

java - "inconsistent synchronization"是什么意思?

这是我的Java1.6类:publicclassFoo{privateArrayListnames;publicvoidscan(){if(names==null){synchronized(this){this.names=newArrayList();//fillthearraywithdata}}}}Findbugs说:Inconsistentsynchronizationofcom.XXX.Foo.names;locked40%oftime这是什么意思,我做错了什么?当两个或多个客户端同时调用Foo.scan()时,我试图避免出现问题。 最佳答案

java - Servlet 混合 header 和内容并在输出中写入相同的两次?

我已经实现了行为不稳定的servlet,有时它会在内容中混合header并写入相同的内容两次。有时它返回的文件包含混合了如下内容的响应header:Server:Apache-Coyote/1.1:W/"43-1353687036000"DatCCoonntenntt--DDiissppoosittiioonn::atatatacehnmte;ntf;ilfenlaemnea=m20=12201112211127325421_4W1_Wirnkgi_nSgc_Seern.xnlsxsxContent-Typ-eT:ype:applaipcatciaoti/on/toctestt-rst

Java缓存对象返回旧值

我有缓存列表,我的代码是这样的publicclassMyList{privatefinalListcache=newArrayList();privateListloadMyList(){//HEAVYOPERATIONTOLOADDATA}publicListlist(){synchronized(cache){if(cache.size()==0){cache.addAll(loadMyList());}returnCollections.unmodifiableList(cache);}}publicvoidinvalidateCache(){synchronized(cache

java - 同步 : Threads execute two critical sections in same order

我有以下类型的代码:synchronizedblock1{//onlyonethreadintheblock}{lotofcodewheresynchronizationnotnecessary}synchronizedblock2{//onlyonethreadintheblock.//Allthethreadsthatexecutedblock1beforethisthreadshouldhavealreadyexecutedthisblock.}每个线程首先以相同的顺序执行block1、非同步块(synchronizedblock)和block2。如果线程T1在线程T2之前执行b

java - hibernate/Ehcache : evicting collections from 2nd level cache not synchronized with other DB reads

我有一个使用JPA、Hibernate和ehcache的应用程序,以及Spring的声明式交易。数据库上的负载相当高,因此所有内容都被缓存以加快速度,包括Collection品。现在集合被单独缓存已经不是什么secret了来自拥有它们的实体,所以如果我删除一个作为此类元素的实体缓存集合,持久化一个应该是一个元素的实体,或者更新一个实体使得它从一个集合移动到另一个集合,我必须执行驱逐手工制作。所以我使用了一个hibernate事件监听器,它跟踪实体被插入、删除或更新并保存该信息以用于在Spring中注册的事务同步事务管理器采取行动。一旦事务已提交。现在的问题是很多时候,一些其他并发事务设