可能重复:
增加java中锁的数量的最佳方法是什么
假设我想基于整数id值进行锁定.在这种情况下,有一个函数可以从缓存中提取值,并且如果值不存在则执行相当昂贵的检索/存储到缓存中.
现有代码未同步,可能会触发多个检索/存储操作:
//psuedocode
public Page getPage (Integer id){
Page p = cache.get(id);
if (p==null)
{
p=getFromDataBase(id);
cache.store(p);
}
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是同步id上的检索,例如
if (p==null)
{
synchronized (id)
{
..retrieve, store
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用,因为2个单独的调用可以具有相同的Integer id值但是具有不同的Integer对象,因此它们不会共享锁,并且不会发生同步.
有没有一种简单的方法可以确保您拥有相同的Integer实例?例如,这会工作:
syncrhonized (Integer.valueOf(id.intValue())){
Run Code Online (Sandbox Code Playgroud)
Integer.valueOf()的javadoc似乎意味着您可能会获得相同的实例,但这看起来不像是一个保证:
返回表示指定int值的Integer实例.如果不需要新的Integer实例,通常应优先使用此方法,而不是构造函数Integer(int),因为此方法可能通过缓存频繁请求的值来显着提高空间和时间性能.
那么,关于如何获得保证相同的Integer实例的任何建议,除了更精细的解决方案,比如保持Lock对象的WeakHashMap键入int?(没错,看起来似乎必须有一个明显的单行而不是我错过了).
我的Java程序想要读取一个文件,该文件可以被写入其中的另一个程序锁定.我需要检查文件是否被锁定,如果是,请等待它是免费的.我该如何实现这一目标?
Java程序在Windows 2000服务器上运行.
我有一个程序可以生成大量数据并将其放入队列中进行写入,但问题是它生成的数据比我当前正在编写的更快(导致它达到最大内存并开始减速).订单无关紧要,因为我打算稍后解析文件.
我环顾了一下,发现了一些问题,帮助我设计了当前的过程(但我仍觉得它很慢).到目前为止,这是我的代码:
//...background multi-threaded process keeps building the queue..
FileWriter writer = new FileWriter("foo.txt",true);
BufferedWriter bufferWritter = new BufferedWriter(writer);
while(!queue_of_stuff_to_write.isEmpty()) {
String data = solutions.poll().data;
bufferWritter.newLine();
bufferWritter.write(data);
}
bufferWritter.close();
Run Code Online (Sandbox Code Playgroud)
我对编程很新,所以我可能会评估这个错误(可能是硬件问题,因为我正在使用EC2),但有一个非常快速地将队列结果转储到一个文件中,或者如果我的方法可以,我可以改进吗不知何故?由于顺序无关紧要,在多个驱动器上写入多个文件会更有意义吗?线程是否会让它更快?等等.我不确定最好的方法,任何建议都会很棒.我的目标是保存队列的结果(抱歉没有输出到/ dev/null :-)并保持我的应用程序尽可能低的内存消耗(我不是100%肯定但是队列填满了15gig,所以我我假设它将是一个15gig +文件).
在文本文件中编写大量数据的最快方法Java(实现我应该使用缓冲 编写器)在Windows上用Java编写并发文件(让我看到可能是多线程写入并不是一个好主意)