Tag: 并发

FileInputStream和FileOutputStream到同一个文件:read()是否保证看到所有write()s“之前发生过”?

我使用文件作为大数据的缓存。 一个线程按顺序写入,另一个线程按顺序读取它。 我是否可以确定在一个线程中write()所有数据(通过write() )可以从另一个线程read() ,假设在Java内存模型方面存在适当的“先发生”关系? 这种行为是否有记录? 编辑 :在我的JDK中, FileOutputStream不会覆盖flush() ,并且OutputStream.flush()为空。 这就是我想知道的原因…… 编辑^ 2 :有问题的流程完全由我完全控制的类所拥有。 保证每个流只能由一个线程访问。 我的测试显示它按预期工作,但我仍然想知道这是否有保证和记录。 另见此相关讨论: http : //chat.stackoverflow.com/rooms/17598/discussion-between-hussain-al-mutawa-and-user946850

CollectionOfElements上的java.util.ConcurrentModificationException

当我在Embedabble中有一个CollectionOfElements时,我似乎得到一个ConcurrentModificationException。 如果想拥有它,那么如果我将Route从Embedabble改为Entity,那么一切正常。 我甚至尝试过添加@Version,但这似乎不起作用。 这是我的课程片段。 Kart.java: @Entity public class Kart { @Id @GeneratedValue private Long id; @Column(nullable=false,length=256) @NotNull @Length(max=256) private String name; @OneToOne(cascade=CascadeType.ALL) private File file; @Version private int version; @CollectionOfElements private Set route; Route.java: @Embeddable public class Route { @Parent private Kart kart; @NotNull @Column(nullable = false, length = 256) private String name; @NotNull @Column(nullable […]

我可以进行ProgressMonitor对话模式吗?

有没有办法从ProgressMonitor模态进行对话? 编辑: JAVA API中的ProgressMonitor类将带来一个顶部但不是Modal的对话框。 用户仍然可以访问后台GUI。 我正在寻找一个modal dialog来显示进度,并允许用户在中间停止任务。

当我对List进行排序时,它的迭代器会发生什么?

假设我有一个List对象和该列表的迭代器 。 现在我用java.util.Collections.sort()对列表进行排序 迭代器会发生什么? 它的行为是否仍然定义,是否仍然可以使用? 如果没有,我可以阻止销毁列表的迭代器吗? 我知道,这个问题可以通过改变程序设计来克服,例如克隆列表,但我特别想知道Java的“官方”行为。

使用带有返回值的同步方法包装一系列异步调用

我当前的代码使用一系列异步进程,最终结果。 我需要以这样的方式包装每一个,每个都通过同步方法访问,结果作为返回值。 我想使用执行程序服务来执行此操作,以便允许许多这些服务同时发生。 我觉得Future可能与我的实现相关,但我无法找到一个很好的方法来实现这一点。 我现在拥有的: public class DoAJob { ResultObject result; public void stepOne() { // Passes self in for a callback otherComponent.doStepOne(this); } // Called back by otherComponent once it has completed doStepOne public void stepTwo(IntermediateData d) { otherComponent.doStepTwo(this, d); } // Called back by otherComponent once it has completed doStepTwo public void stepThree(ResultObject […]

从Guava RemovalListener重新插入条目是否安全?

我有一个Guava Cache (或者更确切地说,我正在从MapMaker迁移到Cache ),这些值代表长时间运行的作业。 我想将expireAfterAccess行为添加到缓存中,因为这是清理它的最佳方法; 但是,即使在一段时间内没有通过缓存访问该作业,该作业仍可能仍在运行,在这种情况下,我需要阻止它从缓存中删除。 我有三个问题: 在RemovalListener回调期间重新插入正在删除的缓存条目是否安全? 如果是这样,它是线程安全的,这样,当RemovalListener回调仍在另一个线程中发生时, CacheLoader没有可能产生该键的第二个值吗? 有没有更好的方法来实现我想要的? 这不是严格/只是一个“缓存” – 每个密钥只使用一个且只有一个值是至关重要的 – 但是我还希望在它表示的作业完成后将条目缓存一段时间。 之前我正在使用MapMaker ,我需要的行为现在已在该类中弃用。 在作业运行时定期ping地图是不优雅的,在我的情况下,不可行。 也许正确的解决方案是拥有两个地图,一个没有驱逐,一个有,并在完成时将它们迁移。 我也会提出一个function请求 – 这可以解决问题:允许锁定单个条目以防止驱逐(然后解锁)。 [编辑以添加一些细节]:此地图中的键指的是数据文件。 这些值可以是正在运行的写入作业,也可以是已完成的写入作业,或者 – 如果没有正在运行的作业 – 是一个只读,生成在查找对象,其中包含从文件中读取的信息。 每个文件正好有零个或一个条目,这一点很重要。 我可以为这两件事使用单独的地图,但必须在每个键的基础上进行协调,以确保一次只存在一个或另一个。 在获得并发性方面,使用单个映射使其更简单。

为什么ScheduledExecutorService.schedule()启动的线程永远不会终止?

当我通过调用ScheduledExecutorService.schedule()创建一个线程时,它在执行计划任务后永远不会终止。 例如,以下程序永远不会退出: public static void main(String[] args) { ScheduledFuture scheduledFuture = Executors.newSingleThreadScheduledExecutor().schedule(new Callable() { public Void call() { doSomething(); return null; } }, 1, TimeUnit.SECONDS); } public static void doSomething() { } 这是一个JDK错误,还是我错过了什么?

ScheduledThreadPoolExecutor和corePoolSize 0?

我想要一个ScheduledThreadPoolExecutor ,如果没有工作要做,它也会停止最后一个线程,如果有新任务,则创建(并保持线程活动一段时间)。 但是,一旦没有更多工作要做,它应该再次丢弃所有线程。 我天真地将它创建为new ScheduledThreadPoolExecutor(0)但结果是,没有创建任何线程,也没有执行任何计划任务。 任何人都可以告诉我,如果我没有在ScheduledThreadpoolExecutor周围编写自己的包装器就可以实现我的目标吗? 提前致谢!

DatagramSocket.send线程是否安全?

我打算使用DatagramSocket一个实例,并从不同的线程调用它的send方法……将UDP数据包发送到不同的客户端。 方法线程是否安全,即从不同的线程调用此方法不会产生任何麻烦/不一致/竞争条件? 谢谢!

是否在线程结束时发出通知? 为什么这个代码示例有效?

我正在寻找线程的一些难题,我无法弄清楚为什么以下一致打印999999 : class Job extends Thread { private Integer number = 0; public void run() { for (int i = 1; i < 1000000; i++) { number++; } } public Integer getNumber() { return number; } } public class Test { public static void main(String[] args) throws InterruptedException { Job thread = new Job(); thread.start(); […]