- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我们有一个客户端/服务器应用程序。客户端将目录发送到服务器,服务器将存储它。
客户端与服务器通信的协议(protocol)如下。
发送 clientId。 [说客户端1]
发送目录的元数据。
发送目录。 [/tmp/client1]
服务器执行以下操作作为响应。
验证 clientId。
分析客户端目录的元数据。
将文件存储在 [/tmp/server/client1]。
通常我们希望服务器是多线程的,以便它可以一次为多个客户端提供服务。对于每个客户端,都会生成一个新线程来处理它。
这是从客户端读取目录的服务器代码的一部分。
public DirServer readDir() throws IOException, ClassNotFoundException {
DirClient clientDir = (DirClient) objectInputStream.readObject();
String serverDirPath = "/tmp/server"
+ "/" + clientId;
List<FileServer> serverFiles = new ArrayList<>();
DirServer dirServer = null;
synchronized (lockObject) {
FileUtils.deleteDirectory(new File(serverDirPath));
Path pathToDir = Paths.get(serverDirPath);
Files.createDirectories(pathToDir.getParent());
for (int i = 0; i < clientDir.getNumberOfFiles(); i++) {
serverFiles.add(readFile());
}
dirServer = new dirServer(clientDir.getFullPath(), serverDirPath, serverFiles);
}
return dirServer;
}
假设我们现在线程池中有两个线程为客户端服务。
案例1:
线程 1:client1
线程 2:客户端 1
即来自不同计算机的 client1 的两个实例尝试联系服务器。对于这种情况,需要同步访问代码块,因为它们访问相同的路径/tmp/server/client1。
案例2:
线程 1:client1
线程 2:client2
对于这种情况,不同步访问代码块的效率要高得多。由于两个线程处理不同的路径/tmp/server/client1 和/tmp/server/client2。
应该如何实现这种条件同步?即仅当您访问同一目录时才同步,否则不同步。
请注意,执行synchronized(clientDir) 不起作用,因为该对象是通过网络读取的。因此,尽管两个 clientDir 在逻辑上可能相同,但它们实际上是两个不同的引用。
您可以假设您可以执行 clientDir.getClientId() 来获取客户端的 Id。
最佳答案
因为您需要在“逻辑clientDir”上同步。
您可以使用 clientDir
作为 key
从 HashMap 中获取虚拟对象,并在其上进行同步。
写入 hashmap 应该同步,但读取不应该同步。并且写入量不能超过“逻辑客户端目录”的数量。
==编辑==
读取返回现有虚拟对象是可以的(因为它们的行为类似于final),不需要同步。
返回 null
的读取将需要在同步内重新读取和(可能)写入。
关于java - 如何有效地同步对目录的访问以最大化并发性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32365910/
我有这个代码: private void doSomething() throws InterruptedException { WorkerThread w= new WorkerThrea
我有一个关于并发的简单问题。我正在通过可运行接口(interface)实现线程和并发。如果我首先初始化线程,然后在初始化后单独调用 start,或者如果我初始化线程并从同一个 for 循环中调用 st
我刚开始接触并发,所以如果我问一些明显/愚蠢的问题,请多多包涵。我正在尝试采取第一步来改造我必须利用 Java 货币的模型。没有详细说明,我有一部分模型加载了一些文件,然后在给定请求时它返回文件上的一
我有一个 java 类,它同时被很多线程访问,我想确保它是线程安全的。该类有一个私有(private)字段,它是字符串到字符串列表的映射。我已将 Map 实现为 ConcurrentHashMap 以
正如我们所知,ThreadPoolExecutor 使用一些 BlockingQueue 作为传入任务的队列。我想要的是让 ThreadPoolExecutor 有一个 second 队列,用于准备就
若两个操作同时发生,则称为并发,但事实上,操作是否在时间上重叠并不重要。由于分布式系统复杂的时钟同步问题,现实中很难严格判断两个事件是否同时发生。 为更好定义并发性,并不依赖确切发生时间,即若两个操作
这是计算任意数的阶乘的代码: unsigned long long factorial(int n) { Concurrency::combinable products=Concurrency:
我找不到使用最新的 JAVA 并发例程的这种特定情况的示例。 我计划使用threads 来处理来自开放队列的项目,该队列可能包含 0 到数千个请求。我想限制在任何给定时间有不少于 0 且不超过 10
我正在迈出学习多线程的第一步,并构建一个小测试程序,以便为自己提供一些见解。由于重新排序的可能性,我不相信我的解决方案是安全的.. 这是主程序: public class SynchTest {
我目前正在从事一个搜索引擎项目。为了更快的爬行速度,我在每次链接访问时使用一个 goroutine。但是我遇到了两个让我疑惑的问题! 第一个是代码示例: package main import "fm
我一直在使用 Azure 存储队列通过 QueueTrigger 属性来提供 WebJob。我将 QueueTrigger 配置为将多个项目出队以进行并发处理,如下所示: public static
我正在使用Rails的一些中间件,使用的是最新版本: pfernand-2-mn:~ pfernand$ rails -v Rails 3.1.2 这是rake middleware的输出: use
我一直在尝试使用 Azure Data Lake Store,并且在文档中 Microsoft 声称该系统针对低延迟小文件写入进行了优化。测试它我尝试对单个文件执行大量并行任务写入,但此方法在大多数情
假设我有一个同步的 HashMap,它有一个字符串作为键和一个列表作为值。 Map> map = Collections.synchronizedMap(new HashMap>()); 这个列表是线
这个问题在这里已经有了答案: ConcurrentModificationException for ArrayList [duplicate] (6 个答案) 关闭 9 年前。 我有一个关于我的
问题 当且仅当有空闲 CPU 时,我如何扩展以使用更多线程?像 ThreadPoolExecutor 这样的东西,它在 cpu 核心空闲时使用更多线程,如果没有空闲则更少或只使用一个线程。 用例 现状
这个问题已经有答案了: 已关闭13 年前。 Possible Duplicate: Thread safety in Java class 我正在阅读实践中的 Java 并发,并且我遇到了一个令我困惑
Stroustrup 在C++ 第 4 版第 1193 页中给出了以下示例。我的问题是使用两个线程的并发程序,一个用于 f(),另一个用于 g() 以及 Stroustrup 的声明: if a li
我是一名优秀的程序员,十分优秀!