假设我们有一些资源(磁盘上的文件),我们必须写入不同线程产生的字节。这些线程由某些进程生成,该进程侦听某些事件并在每次事件发生时生成线程。因为我们只有一个资源,所以我们必须同步执行写操作的类的方法:
synchronized void write(byte [] bytes) {
//write data to file
}
或创建一些互斥:
Object mutex = new Object();
void write(byte [] bytes) {
synchronized(mutex) {
//write data to file
}
}
现在假设我们有非常旧的硬盘驱动器,因此执行写操作的速度太慢。我们一天有好几次发生了大量的事件。所以线程会像资源队列一样。所以我有下一个问题:
DataSource
对象,它产生Connection
个参与连接池的对象,它是否与上面的文件相同?答案 0 :(得分:3)
Executors
。ReentrantLock
。但是基本同步或不公平锁定会更耗时。答案 1 :(得分:2)
答案 2 :(得分:2)
从我有限的理解:
1-它可能非常大,受系统可以拥有的线程数限制(我认为它受最大线程数或某些OS本机资源限制的限制)。我见过100 +。
2-是的,线程应以FIFO方式获取资源。
3-不,具有较高优先级的线程可能会更快地排队,但是在排队后,它们的位置是固定的。
4-数据源可能有所不同,它主要取决于池的实现。我认为Apache的dbcp(如Tomcat中所示)表现得这样,只是如果池在设定的时间内无法分配连接,则可能会触发超时。
希望这有帮助。