Tag: 并发

java哈希映射线程可见性

我在初始化时完全加载了一个java HashMap,但在初始化之后,多个线程将从HashMap读取数据。 我想避免任何类型的同步,因为地图基本上是只读的,永远不会改变。 但我可以保证所有线程都可以看到所有键和值吗?

如何在java中同步静态方法

在Java中实现单例模式时,我想出了这个问题。 即使下面列出的示例不是我的真实代码,但与原始代码非常相似。 public class ConnectionFactory{ private static ConnectionFactory instance; public static synchronized ConnectionFactory getInstance(){ if( instance == null ){ instance = new ConnectionFactory(); } return instance; } private ConnectionFactory(){ // private constructor implementation } } 因为我不太确定静态同步方法的行为,所以我从谷歌得到了一些建议 – 在同一个类中没有(或尽可能少)多个静态同步方法。 我想在实现静态同步方法时,会使用属于Class对象的锁,这样多个静态同步方法可能会降低系统的性能。 我对吗? 或者JVM使用其他机制来实现静态同步方法? 如果我必须在类中实现多个静态同步方法,那么最佳实践是什么? 谢谢你们! 亲切的问候!

双重检查锁定模式:是否破碎?

为什么模式被认为是破碎的? 它看起来很好吗? 有任何想法吗? public static Singleton getInst() { if (instace == null) createInst(); return instace; } private static synchronized createInst() { if (instace == null) { instace = new Singleton(); } }

如何使用JAVAFX 2中的AreaChart绘制实时流数据 – 并发,动画,图表

要求 – 使用实时流数据构建动画AreaChart。 也许每1秒绘制300个数据点。 详细信息 – 因此,我需要从医疗设备读取患者呼吸模式的实时流数据,并使用JavaFX中的AreaChart以波形方式显示它。 我是JavaFX的新手,因此我构建了一个小型POC,以了解JavaFX中的并发和动画是如何工作的。 这个概念有效,我对基本测试感到满意,就实现function而言。 但是我对下面代码中的性能表示不满意。 在下面的工作代码中,我创建了一个单独的线程来模拟从医疗设备获取数据。 该线程只生成一个随机数并将其添加到ConcurrentLinkedQueue。 JavaFX Application线程通过时间轴从队列中提取此数据,并将其添加到AreaChart系列。 这种类型为我提供了我需要的动画,并且在运行时添加了数据。 您可以复制粘贴此代码并对其进行测试。它应该可以正常工作。 但性能并不令人印象深刻 – CPU使用率达到56% – 我的笔记本电脑上有一块Intel Core 2 Duo @ 2.53 GHZ和4GB内存。 我的显卡是采用最新驱动程序的Mobile Intel 4 Series express。 如何改进此动画或绘制实时数据,以获得更好的性能? 注意:如果是瓶颈,我愿意在动画上妥协。 我对这里显示的实现开放了http://smoothiecharts.org/ ,其中波形只是预构建的,只是从右到左流式传输。 import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.logging.Level; import java.util.logging.Logger; import javafx.animation.Animation; import javafx.animation.KeyFrame; import javafx.animation.SequentialTransition; import javafx.animation.Timeline; import […]

如何避免使用Java ServerSocket阻塞?

我正在研究一个套接字监听器,它必须在2个端口上侦听2种类型的数据(端口80和端口81)。 这些数据与对数据执行的操作类型非常相似,只是因为它们到达不同的端口而不同。 我继续使用Java的ServerSocket类编写了一个实现,但后来才意识到ServerSocket类的accept()方法是块,我的实现无法承受。 所以现在我正在考虑使用Java NIO实现相同的function,但在完成了一些教程之后,我认为我比我的开始更困惑。 如果这里的某个人可以引导我完成整个过程,即使它是伪代码或技术“下一步该做什么”,那将是很棒的。 这就是我打算实现的目标。 通过调用2个类似的线程来监听,就像永远在2个端口上一样。(非阻塞)来自某个网​​络位置的远程设备连接,发送数据然后断开连接。 我想如果只知道如何使用NIO来设置服务器来监听端口,那么就可以实现localhost上的端口80,其余部分都很容易实现。 干杯

Java内存模型:创建最终实例字段的循环参考图是否安全,所有这些都在同一个线程中分配?

能比我更了解Java内存模型的人确认我理解以下代码是否正确同步? class Foo { private final Bar bar; Foo() { this.bar = new Bar(this); } } class Bar { private final Foo foo; Bar(Foo foo) { this.foo = foo; } } 我知道这段代码是正确的,但我没有完成整个过程– 在数学之前 。 我确实找到两个非正式的引用,表明这是合法的,虽然我有点担心完全依赖它们: final字段的用法模型很简单:在该对象的构造函数中设置对象的最终字段; 并且在对象的构造函数完成之前,不要在另一个线程可以看到的地方写入对正在构造的对象的引用。 如果遵循此操作,那么当另一个线程看到该对象时,该线程将始终看到该对象的最终字段的正确构造版本。 它还将看到那些最终字段引用的任何对象或数组的版本,这些字段至少与最终字段一样是最新的。 [ Java®语言规范:Java SE 7 Edition ,第17.5节 ] 另一个参考: 对象的正确构造意味着什么? 它只是意味着在构造过程中不允许对正在构造的对象的引用“逃逸”。 (有关示例,请参阅安全构造技术。)换句话说,不要在另一个线程可能看到的任何地方放置对正在构造的对象的引用; 不要将它分配给静态字段,不要将其注册为任何其他对象的侦听器,依此类推。 这些任务应在构造函数完成后完成,而不是在构造函数中完成。 [ JSR 133(Java内存模型)常见问题解答 […]

外部共享资源的Java并发模式(智能卡)

我有一个Web服务器服务,客户端请求智能卡计算并获得结果。 可用的智能卡号可以在服务器正常运行时间内减少或增加 ,例如,我可以从阅读器中物理添加或删除智能卡(或许多其他事件……例如exception等)。 智能卡计算可能需要一段时间,因此如果存在对Web服务器的并发请求,我必须优化这些作业以使用所有可用的智能卡。 我想过使用智能卡线程池。 至少在我看来,不寻常的是,池应该改变它的大小,而不是取决于客户端的请求,而只取决于智能卡的可用性。 我研究过很多例子: BlockingQueue :存储请求和停止线程等待某事做的好看。 FutureTask :我可以使用这个类来让客户端等待它的答案,但是哪种类型的执行者应该完成任务呢? ThreadPoolExecutor :似乎我需要什么,但有了这个我不能改变池大小,而且每个线程应该链接到一个智能卡插槽。 如果我可以更改池大小(在插入智能卡时添加线程并在删除智能卡时删除线程)以及我是否可以为每个线程分配特定智能卡,这可以是一种解决方案。 这是智能卡控制,每个智能卡有一个SmartcardWrapper,每个智能卡都有自己的插槽号。 public class SmartcardWrapper{ private int slot; public SmartcardWrapper(int slot) { this.slot=slot; } public byte[] compute(byte[] input) { byte[] out=new byte[]; SmartcardApi.computerInput(slot,input,out); //Native method return out; } } 我试图创建一个每个智能卡一个线程的线程池: private class SmartcardThread extends Thread{ protected SmartcardWrapper sw; public SmartcardThread(SmartcardWrapper sw){ this.sw=sw; […]

易失性变量和非易失性重新排序/可见性

所以我认为我已经足够了解这些东西,直到我读到让我怀疑这个主题的东西。 我几乎可以肯定这本书是不正确的,但也想问社区。 PS:没有看过这本书的勘误,所以很可能被误认为是错误的。 一个简化的例子: public class VolatileMain { private volatile int a = 0; private String text = “”; public static void main(String[] args) throws Exception { VolatileMain vm = new VolatileMain(); Thread writer = new Thread() { @Override public void run() { System.out.println(“Running thread ” + Thread.currentThread().getName()); vm.text = “hello world”; vm.a = 5; […]

使用Java以multithreading模式处理图像

我应该使用Java以multithreading模式处理图像。 当我的线程数被修复时,我可能有不同数量的图像。 我必须使用固定的线程集处理所有图像。 我只是坚持如何做到这一点,我看看ThreadExecutor和BlockingQueues等…我仍然不清楚。 我正在做的是, – 获取图像并将它们添加到LinkedBlockingQueue中,LinkedBlockingQueue具有图像处理器的可运行代码。 – 创建一个threadpoolexecutor,其中一个争论是之前的LinkedBlockingQueue。 – 通过for循环迭代直到队列大小并执行threadpoolexecutor.execute(linkedblockingqueue.poll)。 – 我只看到它只处理100个图像,这是在LinkedBlockingQueue大小中传递的最小线程大小。 我知道我在某处理解我是非常错误的,如何处理100(线程)组中的所有图像,直到它们全部完成? 任何示例或伪代码都非常有用 谢谢! Ĵ

如何以线程安全的方式在DAO中缓存信息

我经常需要为一些不经常变化的参考数据实现DAO。 我有时会在DAO的集合字段中缓存它 – 因此它只加载一次并在需要时显式更新。 但是,这会带来许多并发问题 – 如果另一个线程在加载或更新时尝试访问数据会怎样。 显然,这可以通过使数据的getter和setter同步来处理 – 但对于大型Web应用程序来说,这是一个相当大的开销。 我已经包含了一个琐碎的例子,说明了我作为一个稻草人所需要的东西。 请建议其他方法来实现这一点。 public class LocationDAOImpl implements LocationDAO { private List locations = null; public List getAllLocations() { if(locations == null) { loadAllLocations(); } return locations; } 有关更多信息,我正在使用Hibernate和Spring,但此要求适用于许多技术。 进一步的想法: 这根本不应该在代码中处理 – 而是让ehcache或类似处理吗? 我缺少一个共同的模式吗? 显然有很多方法可以实现,但我从未找到过简单易维护的模式。 提前致谢!