相关疑难解决方法(0)

了解Java的Reference类:SoftReference,WeakReference和PhantomReference

有人可以解释三个参考类之间的区别(或发布链接到一个很好的解释)?SoftReference> WeakReference> PhantomReference,但当我会用每一个?为什么会出现WeakHashMap,但没有SoftHashMapPhantomHashMap

如果我使用以下代码......

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

80
推荐指数
2
解决办法
2万
查看次数

java同步基于参数

我正在寻找一种基于它接收的参数同步方法的方法,如下所示:

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)吗?

java multithreading synchronized

21
推荐指数
3
解决办法
1万
查看次数

WeakReference无法在Kotlin中运行

我正在AsyncTaskKotlin中实现一个,我需要一个WeakReference用于该方法中运行的回调onPostExecute().我打电话之前设置监听参考execute(),但一旦onPostExecute()被调用,值WeakReferencenull.

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)

android kotlin

13
推荐指数
1
解决办法
9995
查看次数

关闭Java HTTP客户端

有没有办法java.net.http.HttpClient立即释放它所持有的资源?

在内部,它包含一个选择器,一个连接池和一个Executor(当使用默认值时).但它没有实现Closeable/ AutoCloseable.

java java-http-client java-11

9
推荐指数
2
解决办法
967
查看次数

Java/Scala对垃圾收集有什么保证?

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)

java garbage-collection scala playframework-2.3

4
推荐指数
1
解决办法
486
查看次数