gpt4 book ai didi

java - 同步访问资源

转载 作者:行者123 更新时间:2023-12-02 04:39:22 24 4
gpt4 key购买 nike

假设我们有一些资源(磁盘上的文件),我们必须在其中写入不同线程产生的字节。这些线程是由某个进程生成的,该进程监听某些事件并在每次事件发生时生成一个线程。由于我们只有一种资源,因此我们必须同步执行写操作的类的方法:

    synchronized void write(byte [] bytes) {
//write data to file
}

或者创建一些互斥体:

Object mutex = new Object();
void write(byte [] bytes) {
synchronized(mutex) {
//write data to file
}
}

现在假设我们有非常旧的硬盘,因此它执行写入操作的速度太慢。每天都会发生好几次大量的事件。因此线程会对资源进行类似队列的操作。所以我有以下问题:

  1. 这样的队列可能需要多长时间?
  2. 如果有多个线程在等待资源和资源已释放哪个线程将首先占用该资源。将要是不是先进先出原则?
  3. 如果线程具有不同的优先级,情况会发生什么变化?
  4. 如果资源是DataSource对象,它产生参与连接池的Connection对象,会和上面的文件一样吗?

最佳答案

  1. 队列的长度是阻塞线程的数量。如果你继续创建线程并且它们都被写入阻塞,那么你很快就会使系统崩溃。您当然应该使用线程池,重用线程而不是创建线程,并在队列中有太多事件时阻塞。请参阅Executors .
  2. 不,这不是 FIFO。顺序未定义。您可能想使用公平 ReentrantLock如果你想要先进先出。但它比基本同步或非公平锁更耗时。
  3. 依赖于平台,并且没有确定性行为。
  4. 这完全取决于数据源的实现。它可能使用公平算法或简单地使用公平锁。或者它可能只是使用同步而不公平。您需要阅读数据源的文档(如果足够详细)。

关于java - 同步访问资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8055751/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com