Tag: 并发

可以在java中将volatile变量定义为static吗?

我可以声明这样的事吗? static volatile boolean first=false;

如果我在Spring Framework中的@PostConstruct中初始化它们,我应该将对象属性标记为volatile吗?

假设我在Spring单例bean @PostConstruct (简化代码)中做了一些初始化: @Service class SomeService { public Data someData; // not final, not volatile public SomeService() { } @PostConstruct public void init() { someData = new Data(….); } } 我应该担心someData对其他bean的可见性并将其标记为volatile吗? (假设我无法在构造函数中初始化它) 第二种情况:如果我在@PostConstruct 覆盖值(例如在构造函数中进行显式初始化或初始化之后),那么写入@PostConstruct 将不会首先写入此属性?

有效不可变对象

我想确保根据Java Memory Model正确理解’Effectively Immutable Objects’行为。 假设我们有一个可变类,我们希望将其发布为有效的不可变类: class Outworld { // This MAY be accessed by multiple threads public static volatile MutableLong published; } // This class is mutable class MutableLong { private long value; public MutableLong(long value) { this.value = value; } public void increment() { value++; } public long get() { return value; } […]

ExecutorService,避免任务队列过满的标准方法

我正在使用ExecutorService来简化并发multithreading程序。 请使用以下代码: while(xxx) { ExecutorService exService = Executors.newFixedThreadPool(NUMBER_THREADS); … Future … = exService.submit(..); … } 在我的情况下,问题是如果所有NUMBER_THREADS都被占用,则submit()不会阻塞。 结果是任务队列被许多任务淹没。 这样做的结果是,使用ExecutorService.shutdown()关闭执行服务需要很长时间( ExecutorService.isTerminated()将长时间处于假状态)。 原因是任务队列仍然很满。 现在我的解决方法是使用信号量来禁止在ExecutorService的任务队列中有许多条目: … Semaphore semaphore=new Semaphore(NUMBER_THREADS); while(xxx) { ExecutorService exService = Executors.newFixedThreadPool(NUMBER_THREADS); … semaphore.aquire(); // internally the task calls a finish callback, which invokes semaphore.release() // -> now another task is added to queue Future … […]

Java相当于.Net的AutoResetEvent?

我应该使用什么来获得与Java中的AutoResetEvent等效的语义? (请参阅ManualResetEvent的此问题 )。

通过多个线程访问文件

我想通过10个线程访问一个大文件(文件大小可能从30 MB到1 GB),然后处理文件中的每一行,并通过10个线程将它们写入另一个文件。 如果我只使用一个线程来访问IO,则阻止其他线程。 处理花费一些时间几乎相当于从文件系统中读取一行代码。 还有一个约束,输出文件中的数据应与输入文件的数据顺序相同。 我希望你对这个系统的设计有所了解。 是否有任何现有的API支持并发访问文件? 写入同一文件也可能导致死锁。 如果我关心时间限制,请建议如何实现这一点。

Java并发场景 – 我是否需要同步?

这是交易。 我有一个哈希映射,包含我称之为“程序代码”的数据,它存在于一个对象中,如下所示: Class Metadata { private HashMap validProgramCodes; public HashMap getValidProgramCodes() { return validProgramCodes; } public void setValidProgramCodes(HashMap h) { validProgramCodes = h; } } 我有很多很多的读取器线程,每个读取器线程都会调用getValidProgramCodes()一次,然后将该hashmap用作只读资源。 到现在为止还挺好。 这是我们感兴趣的地方。 我想放入一个计时器,每个计时器都会生成一个新的有效程序代码列表(不管怎么做),并调用setValidProgramCodes。 我的理论 – 我需要帮助validation – 是我可以继续按原样使用代码,而无需进行显式同步。 它是这样的:在更新validProgramCodes时,validProgramCodes的值总是很好 – 它是指向新的或旧的hashmap的指针。 这是一切都取决于的假设。 拥有旧hashmap的读者可以; 他可以继续使用旧值,因为在释放之前它不会被垃圾收集。 每个读者都是短暂的; 它很快就会消亡,并被一个能够获得新价值的新人所取代。 这有水吗? 我的主要目标是在绝大多数没有更新的情况下避免代价高昂的同步和阻塞。 我们每小时只更新一次,读者不断闪烁。

Java虚拟机上的arrays分配和访问以及内存争用

观察线程子类的以下定义(为方便起见,整个可运行的Java源文件包含在问题的末尾): final class Worker extends Thread { Foo[] array = new Foo[1024]; int sz; public Worker(int _sz) { sz = _sz; } public void run() { //Foo[] arr = new Foo[1024]; Foo[] arr = array; loop(arr); } public void loop(Foo[] arr) { int i = 0; int pos = 512; Foo v = new Foo(); […]

java方法同步和读/写互斥

我在类中有两个方法read()和write() ,如下所示。 class Store { public void write() { // write to store; } public string read() { // read from store; } } 1) Store对象是单例。 2)我有一个Writer类,它将写入商店和几个同时从商店读取的Reader类。 我的要求是,当作家写信给商店时,所有的读者都应该等待。 即,当控制在write() ,应该阻止对read()所有调用。 我该如何实现这一目标? 我已经尝试在write()方法中synchronize(Store.class) ,但似乎不适合我。

如何在开始编码之前处理并发

我正在编写一个Java程序的中途,而我正在调试比我想要处理的并发问题更多的并发问题。 我不得不问:在精神上设置你的程序时,你如何处理并发问题? 在我的情况下,这是一个相对简单的游戏,但线程问题不断出现 – 任何快速修复几乎肯定会导致一个新问题。 用非常笼统的术语来说,在决定我的应用程序应该如何“流动”而我的所有线程都没有结束时,我应该使用哪些技术?