有人可以解释三个参考类之间的区别(或发布链接到一个很好的解释)?SoftReference> WeakReference> PhantomReference,但当我会用每一个?为什么会出现WeakHashMap,但没有SoftHashMap或PhantomHashMap?
如果我使用以下代码......
WeakReference<String> ref = new WeakReference<String>("Hello!");
if (ref != null) { // ref can get collected at any time...
System.gc(); // Let's assume ref gets collected here.
System.out.println(ref.get()); // Now what?!
}
Run Code Online (Sandbox Code Playgroud)
...怎么了?我是否必须ref在每个语句之前检查是否为null(这是错误的,但我应该怎么做)?对不起快速问题,但我无法理解这些Reference课程......谢谢!
java reference weak-references phantom-reference soft-references
我正在寻找一种基于它接收的参数同步方法的方法,如下所示:
public synchronized void doSomething(name){
//some code
}
Run Code Online (Sandbox Code Playgroud)
我想doSomething基于这样的name参数同步方法:
线程1:doSomething("a");
线程2:doSomething("b");
线程3:doSomething("c");
线程4:doSomething("a");
线程1,线程2和线程3将执行代码而不同步,但线程4将等待,直到线程1完成代码,因为它具有相同的"a"值.
谢谢
UPDATE
根据都铎的解释,我认为我面临另一个问题:这是新代码的示例:
private HashMap locks=new HashMap();
public void doSomething(String name){
locks.put(name,new Object());
synchronized(locks.get(name)) {
// ...
}
locks.remove(name);
}
Run Code Online (Sandbox Code Playgroud)
我没有填充锁定映射的原因是因为name可以有任何值.
基于上面的示例,由于HashMap不是线程安全的,因此在同一时间由多个线程添加/删除散列映射中的值时会出现问题.
所以我的问题是如果我创建了HashMap一个ConcurrentHashMap线程安全的,那么synchronized块会阻止其他线程访问locks.get(name)吗?
我正在AsyncTaskKotlin中实现一个,我需要一个WeakReference用于该方法中运行的回调onPostExecute().我打电话之前设置监听参考execute(),但一旦onPostExecute()被调用,值WeakReference是null.
class PhotoRotationTask(uri: Uri, filePath: String, resolver: ContentResolver) : AsyncTask<Int, Int, Int>() {
private var weakRef : WeakReference<OnBitmapProcessedListener>? = null
var sourceUri : Uri
var resolver : ContentResolver
var destPath: String
init {
this.sourceUri = uri
this.resolver = resolver
this.destPath = filePath
}
fun setOnBitmapProcessedListener(listener: OnBitmapProcessedListener){
weakRef = WeakReference(listener)
Log.d("RotationTask", "set listener ${weakRef?.get() != null}") //This Log proves that weakRef is initialized before onPostExecute()
}
override …Run Code Online (Sandbox Code Playgroud) 有没有办法java.net.http.HttpClient立即释放它所持有的资源?
在内部,它包含一个选择器,一个连接池和一个Executor(当使用默认值时).但它没有实现Closeable/ AutoCloseable.
Play框架具有play.api.libs.Files.TemporaryFile对a的引用File,并在其中删除它TemporaryFile#finalize().
case class TemporaryFile(file: File) {
def clean(): Boolean = {
file.delete()
}
def moveTo(to: File, replace: Boolean = false) {
Files.moveFile(file, to, replace = replace)
}
override def finalize {
clean()
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这有一些问题,例如,你可以填满整个磁盘,而JVM不需要GC.
但在这里我问一个程序的"正确性",即一个没有磁盘空间限制的程序.
def foo() {
val tempFile = TemporaryFile(new File("/tmp/foo"))
val inputStream = new FileInputStream(tempFile.file) // last use
try {
println(inputStream.read())
} finally {
inputStream.close()
}
}
Run Code Online (Sandbox Code Playgroud)
在我从文件中读取之前可以删除/ foo/bar吗?我tempFile之后不使用// last use,所以可以在那之后立即定稿吗?
或者如果它作为参数传递给函数呢?
def foo() {
val …Run Code Online (Sandbox Code Playgroud)