我试图volatile从 Java Concurrency in Practice 一书中理解关键字。我从三个方面比较synchronized关键字和volatile变量:原子性、易变性和重新排序。我对此有一些疑问。我在下面一一讨论过:
书中关于 的可见性说如下synchronized:
当线程执行由同一个锁保护的同步块时,线程
A在同步块中或之前所做的一切都是可见的B。
它说以下关于volatile变量的可见性:
易失性变量不会缓存在寄存器或缓存中,它们对其他处理器隐藏,因此对易失性变量的读取始终返回任何线程的最新写入。
volatile 变量的可见性影响超出了 volatile 变量本身的值。当线程 A 写入一个 volatile 变量,随后线程 B 读取同一个变量时,在写入 volatile 变量之前对 A 可见的所有变量的值在读取 volatile 变量后对 B 可见。所以从内存可见性的角度来看,写入一个 volatile 变量就像退出一个同步块,读取一个 volatile 变量就像进入一个同步块。
Q1. I feel second paragraph above (of volatile) corresponds to what book said about synchronized. But is there synchronized-equivalent to volatile's first paragraph? In other …
我从这里阅读有关java 8默认方法时遇到了以下段落:
如果层次结构中的任何类具有具有相同签名的方法,则默认方法变得无关紧要.默认方法不能覆盖java.lang.Object中的方法.原因很简单,因为Object是所有java类的基类.因此,即使我们将Object类方法定义为接口中的默认方法,它也将是无用的,因为将始终使用Object类方法.这就是为什么要避免混淆,我们不能有重写Object类方法的默认方法.
我很快尝试使用代码来确认行为
public class DefaultMethodClass {
public void defaultMethod()
{
System.out.println("DefaultMethodClass.defaultMethod()");
}
}
public interface DefaultMethodInterface {
public default void defaultMethod()
{
System.out.println("DefaultMethodInterface.defaultMethod()");
}
}
public class DefaultMethodClassInterfaceChild extends DefaultMethodClass implements DefaultMethodInterface
{
public static void main(String[] args) {
(new DefaultMethodClassInterfaceChild()).defaultMethod();
}
}
Run Code Online (Sandbox Code Playgroud)
这打印
DefaultMethodClass.defaultMethod()
Run Code Online (Sandbox Code Playgroud)
我无法看到为什么语言设计师选择这种特定行为背后的任何具体原因.他们的任何重要原因是我失踪了吗?或者它只是接口默认方法在逻辑上比超类提供的具体实现重要性低?
我有一些数据清理任务。我有一个从 H6 开始并进一步向下的列。该列包含的数据应该在snake_case 中,但事实并非如此。单元格值的格式为:
我知道没有具体的算法将这一切带到snake_case,但我想提出至少将大多数单元格带到snake_case的代码。
我尝试用 VBA 代码用下划线替换空格并获取下划线的索引。现在我正在考虑将下划线后的所有字符设为小写。此外,我正在考虑替换两个字符的序列:第一个小写,下一个大写,说lCtol_c因为我不想CCC转换为c_c_c,而是转换为ccc. 但在继续之前,我想知道是否有更简单的方法来解决这个问题。
我发现Collection接口有方法equals并且hashCode也包含在Object. List接口也是如此。我有以下疑问:
我有一个奇怪的复杂数学公式,我将其缩进以便更好地理解如下:
EIET = IET
+ (TLBHR * {(1-PFR) * (TLBT + MAT)
+ PFR * (TLBT + MAT + PFT)
}
)
+ (TLBMR * {(1-PFR) * (TLBT + MAT * (NPT + 1))
+ PFR * (TLBT + MAT * (NPT + 1) + PFT)
}
)
Run Code Online (Sandbox Code Playgroud)
然后我运行它才意识到它导致了意外的缩进。我怎样才能保留这些缩进以便更好地理解方程,并且仍然在 python 中执行它而不会出现缩进错误?