草庐IT

多线段

全部标签

java - 多线程环境下的 HashMap 和哈希表

我真的很困惑这两个集合在多线程环境中的表现。哈希表是同步的,这意味着不会有2个线程同时更新它的值,对吧? 最佳答案 看ConcurrentHashMaps表示线程安全映射。它们提供了HashTable的所有功能,并且性能非常接近HashMap。性能是通过使用map范围锁而不是使用mapwidelock获得的,默认情况下该集合维护一个包含16个锁的列表,每个锁用于锁定map的一个bucket。您甚至可以配置桶的数量:)根据您的数据调整此项可以帮助提高性能。BrianGoetz的《Java并发实践》我怎么推荐都不为过http://jci

java - 编写在多线程 Java 环境中更新两个对象的方法的最佳方法?

假设我们有一个名为AccountService的类来管理帐户的状态。AccountService定义为interfaceAccountService{publicvoiddebit(account);publicvoidcredit(account);publicvoidtransfer(Accountaccount,Accountaccount1);}根据这个定义,实现transfer()的最佳方式是什么,这样您就可以保证transfer是一个原子操作。我对引用Java1.4代码的答案以及可能使用Java5中java.util.concurrent资源的答案感兴趣

java - 一个关于Java多线程的问题

假设下面的类publicclassTestObject{publicvoidsynchronizedmethod1(){//some1000linesofcode}publicvoidmethod2(){//some1000linesofcode}}假设有两个线程访问同一个TestObject类实例,我们称它们为t1和t2。我想知道在以下情况下会发生什么。当t1正在访问method1()的中途时。现在t2正在尝试访问method2()。当t1正在访问method2()的中途时。现在t2正在尝试访问method1()。我的理解是,对于第一个问题,线程t2不会被授予权限,因为object将

java - 什么时候消息传递(例如 JMS)是多线程的替代方案?

我在一个数据处理应用程序上工作,在这个应用程序中,通过将多个工作单元放在一个消息队列上来实现并发,消息驱动bean(MDB)的多个实例会监听该消息队列。除了以这种方式实现并发之外,我们没有任何特定理由使用消息传递基础结构和MDB。这让我开始思考为什么使用多线程无法实现同样的效果。所以我的问题是,在什么情况下可以使用异步消息传递(例如JMS)作为多线程的替代方法来实现并发?使用一种方法相对于另一种方法有哪些优点/缺点。 最佳答案 它不能作为多线程的替代品,它是一种实现多线程的方式。这里有三种基本的解决方案:你负责队列的两端;您负责发送

java - 多线程不比单线程快(简单循环测试)

我正在试验一些多线程结构,但不知何故,多线程似乎并不比单线程快。我将其缩小为一个非常简单的测试,其中包含一个嵌套循环(1000x1000),系统只在其中计算。下面我贴出了单线程和多线程的代码以及它们是如何执行的。结果是单线程完成循环大约需要110ms,而两个线程也需要大约112ms。我不认为问题是多线程的开销。如果我只将两个Runnable中的一个提交给ThreadPoolExecutor,它的执行时间是单线程的一半,这是有道理的。但是添加第二个Runnable会使它慢10倍。两个3.00Ghz内核都在100%运行。我认为这可能是特定于pc的,因为其他人的pc在多线程上显示了双倍速度的

java - 在多线程环境下使用 HashMap

我正在做一个面试题onJavaRevisited我很难理解这个问题:What’swrongwithusingaHashMapinamultithreadedenvironment?Whenget()methodgointoaninfiniteloop?在我看来,使用HashMap不是问题在多线程环境中,只要我们的应用程序没有访问/读取正在修改创建的HashMap的线程,而不是简单地访问HashMap。因此,在我看来,只要在应用程序中我们只是访问HashMap就没有问题。在多线程环境中。请让我知道我的理解是否正确。 最佳答案 What

java - 在多线程(Java 或 .Net)程序中,我可以假设复制变量是原子的吗?

当我想知道这个问题时,我正在担心我正在设计的应用程序中的竞争条件。假设我有一个大型数组或某种集合,由我的程序的一个组件管理,我们称该组件为Monitor。它的工作是定期检查集合是否“脏”,即。e.最近发生了变化,如果是这样,将快照写入磁盘(这是为了在发生崩溃时检查应用程序)并再次将其标记为干净。同一程序的其他组件,运行在不同的线程中,调用监视器的方法向数组/集合中添加数据或修改数据。这些方法将集合标记为脏。现在,更改方法在其他组件的线程中运行,对吧?如果我不那么幸运,它们可能会在快照写入磁盘时被调用,更改已经写入的数据,设置脏标志,然后监视器的线程将其取消设置,而不会保存更改(它改变时

Java Swing多线程访问JTextArea

我有一个多线程JavaSwing应用程序。多个线程将通过textArea.append("something")写入JTextArea来调用该方法。我应该这样包装吗:SwingUtilities.invokeLater(newRunnable(){@Overridepublicvoidrun(){textArea.append("something");}});或者它只是一个内容更新,Swing会自己做正确的线程? 最佳答案 一般来说,您对Swing所做的任何更新,尤其是任何更改控件状态或布局的操作,都应该在Swing线程中完成。在

java - 在*多线程* Swing 应用程序中使用 Hibernate 进行 session 管理

我目前正在从事我的一个(相当大的)宠物项目,一个本质上需要多线程的Swing应用程序。几乎所有的用户交互都可能通过互联网从一些远程服务器获取数据,因为我既不控制这些服务器也不控制互联网本身,因此较长的响应时间是不可避免的。当EDT繁忙时,SwingUI显然无法重绘自身,因此所有远程服务器调用都需要由后台线程执行。我的问题:后台线程获取的数据通过本地(内存中)数据库中的数据“丰富”(远程服务器返回本地数据库中数据的ID/引用)。这些数据后来最终被传递到EDT,在那里它成为View模型的一部分。某些实体此时未完全初始化(启用延迟获取),因此用户可能会触发延迟获取,例如在JTable中滚动。

java - Spring + Hibernate + Envers + 多线程 - session 关闭

我们使用Hibernate(带有JPA)和HibernateEnvers来保存对象的历史记录。Web应用程序运行许多线程,其中一些是由其他应用程序调用RMI方法创建的,一些是由应用程序本身创建的,还有一些是为处理http请求(它们生成View)而创建的。我们还使用OpenSessionInView模式来管理session,因此我们的web.xml包含:openEntityManagerInViewFilterorg.springframework.orm.jpa.support.OpenEntityManagerInViewFilteropenEntityManagerInViewFi