我正在阅读 Doug Lea 所著的“Java 设计原则和模式中的并发编程”。他说:
与每个类相关联的静态锁与任何其他类(包括其超类)的静态锁无关。在试图保护超类中声明的静态字段的子类中添加新的静态同步方法是无效的。请改用显式块版本。
为什么无效?为什么显式块版本有效?
免责声明:我对nifi一无所知。
我需要从ListenHTTP处理器接收消息,然后将每条消息转换为带时间戳的 json 消息。
假设我hello world在凌晨 5 点收到消息。它应该将其转换为{"timestamp": "5 am", "message":"hello world"}.
我怎么做?
class A {
private static BigInteger staticCode = BigInteger.ZERO;
private BigInteger code;
public A() {
synchronized(staticCode) {
staticCode = staticCode.plus(BigInteger.ONE);
code = staticCode;
}
}
}
Run Code Online (Sandbox Code Playgroud)
无论如何,我不是并发方面的专家。有人可以向我解释为什么上面提供的类不是线程安全的吗?
哪些情况会导致竞争条件?我的想法是,如果我们创建这个类的 10 个实例,每个实例都会在不同的值上同步staticCode,这就是为什么它是线程安全的,但有人告诉我事实并非如此。但为什么?
我知道我们可以同步.class并且它肯定是线程安全的,但我仍然想了解这种特殊情况。
我尝试运行这段代码:
product (x:xs) = x * product xs
product [] = 1
sum [] = 0
sum (n:ns) = n + sum ns
sum [2,3,6]
product [2,3,4]
Run Code Online (Sandbox Code Playgroud)
由于某种原因,它给了我“功能中的非详尽模式”错误,对于sum和product定义。
为什么这些模式不是详尽无遗的?我已经在一个空列表和一个包含 1 个或多个元素的列表上定义了函数。它还需要什么?
我正在使用The Glorious Glasgow Haskell Compilation System, version 9.2.4这些例子来自 Graham Hutton 的书。自 2016 年(本书撰写之时)以来,Haskell 编译器发生了一些变化。
File的renameTo方法仅在目录为空时有效。除了建立新目录并将旧目录的内容复制到其中之外,使它工作最简单的方法是什么?