小编ani*_*nir的帖子

了解 Java 中同步块与 volatile 变量的原子性、可见性和重新排序

我试图volatile从 Java Concurrency in Practice 一书中理解关键字。我从三个方面比较synchronized关键字和volatile变量:原子性、易变性和重新排序。我对此有一些疑问。我在下面一一讨论过:

1) 可见性:`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 multithreading

3
推荐指数
1
解决办法
124
查看次数

在java 8中实现接口从超类继承方法而不是默认方法的意义

我从这里阅读有关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)

我无法看到为什么语言设计师选择这种特定行为背后的任何具体原因.他们的任何重要原因是我失踪了吗?或者它只是接口默认方法在逻辑上比超类提供的具体实现重要性低?

java java-8 default-method

2
推荐指数
2
解决办法
149
查看次数

将单元格值转换为 snake_case

我有一些数据清理任务。我有一个从 H6 开始并进一步向下的列。该列包含的数据应该在snake_case 中,但事实并非如此。单元格值的格式为:

  • 搭配骆驼套:“CamelCase”
  • 带空格:“间隔值”
  • 有一些初始呼叫上限:ALLCAPSPREFIX_rest
  • 以上组合

我知道没有具体的算法将这一切带到snake_case,但我想提出至少将大多数单元格带到snake_case的代码。

我尝试用 VBA 代码用下划线替换空格并获取下划线的索引。现在我正在考虑将下划线后的所有字符设为小写。此外,我正在考虑替换两个字符的序列:第一个小写,下一个大写,说lCtol_c因为我不想CCC转换为c_c_c,而是转换为ccc. 但在继续之前,我想知道是否有更简单的方法来解决这个问题。

regex string excel vba

2
推荐指数
1
解决办法
1166
查看次数

为什么接口有一些 Object 类的方法?

我发现Collection接口有方法equals并且hashCode也包含在Object. List接口也是如此。我有以下疑问:

  1. 为什么接口应该有这些方法?仅仅是因为它们与 中的含义不同Object吗?
  2. 根据这个问题,包含这些方法并不强制实现类提供它们的实现,因为这些实现已经提供并继承自Object. 因此,从技术上讲,将它们包含在接口中没有任何效果。这再次强调了第一个疑问的重要性,为什么接口需要有这些方法?

    这个页面说:

    这些方法对对象的状态执行计算,但接口通常无法访问状态;只有实现类可以访问此状态。

    我觉得这进一步增加了第一个问题的重要性。

  3. 如果我们在接口中完全需要它们,那么为什么 Java 框架没有包含它们的超级接口并且让这样的接口实现这个接口,就像所有类都是 的子类一样Object?

java

2
推荐指数
1
解决办法
66
查看次数

使python忽略在带有缩进的多行上放置的简单数学方程中的缩进

我有一个奇怪的复杂数学公式,我将其缩进以便更好地理解如下:

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 中执行它而不会出现缩进错误?

python

1
推荐指数
1
解决办法
202
查看次数

标签 统计

java ×3

default-method ×1

excel ×1

java-8 ×1

multithreading ×1

python ×1

regex ×1

string ×1

vba ×1