小编Qua*_*fel的帖子

使用lambda而不是显式匿名内部类时的不同通用行为

上下文

我正在开发一个严重依赖泛型类型的项目.它的一个关键组件是所谓的TypeToken,它提供了一种在运行时表示泛型类型并在其上应用一些实用函数的方法.为了避免Java的类型擦除,我使用大括号notation({})来创建一个自动生成的子类,因为这使得类型可以恢复.

什么TypeToken基本上做

这是一个强烈简化的版本,TypeToken比原始实现更宽松.但是,我正在使用这种方法,所以我可以确保真正的问题不在于其中一个效用函数.

public class TypeToken<T> {

    private final Type type;
    private final Class<T> rawType;

    private final int hashCode;


    /* ==== Constructor ==== */

    @SuppressWarnings("unchecked")
    protected TypeToken() {
        ParameterizedType paramType = (ParameterizedType) this.getClass().getGenericSuperclass();
        this.type = paramType.getActualTypeArguments()[0];

        // ...
    } 
Run Code Online (Sandbox Code Playgroud)

当它工作

基本上,这种实现几乎适用于所有情况.处理大多数类型没有问题.以下示例完美运行:

TypeToken<List<String>> token = new TypeToken<List<String>>() {};
TypeToken<List<? extends CharSequence>> token = new TypeToken<List<? extends CharSequence>>() {};
Run Code Online (Sandbox Code Playgroud)

由于它不检查类型,上面的实现允许编译器允许的每种类型,包括TypeVariables.

<T> void test() {
    TypeToken<T[]> token = new TypeToken<T[]>() {};
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,type …

java generics lambda java-8

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

Java 中的内存栅栏是做什么用的?

在试图了解SubmissionPublisherJava SE 10 中的源代码,OpenJDK | docs),在版本 9 中添加到 Java SE 的新类是如何实现的,我偶然发现了一些VarHandle我以前不知道的API 调用:

fullFenceacquireFencereleaseFenceloadLoadFencestoreStoreFence

在做了一些研究之后,特别是关于内存屏障/栅栏的概念(我以前听说过它们,是的;但从未使用过它们,因此对它们的语义非常不熟悉),我想我对它们的用途有了基本的了解. 尽管如此,由于我的问题可能源于误解,我想确保我首先做对了:

  1. 内存屏障是关于读写操作的重新排序约束。

  2. 内存屏障可以分为两大类:单向和双向内存屏障,这取决于它们是否对读取或写入或两者都设置了约束。

  3. C++ 支持多种内存屏障,但是,这些与VarHandle. 然而,一些在可用内存壁垒VarHandle提供排序的影响兼容其相应的C ++内存屏障。

    • #fullFence 兼容 atomic_thread_fence(memory_order_seq_cst)
    • #acquireFence 兼容 atomic_thread_fence(memory_order_acquire)
    • #releaseFence 兼容 atomic_thread_fence(memory_order_release)
    • #loadLoadFence并且#storeStoreFence没有兼容的 C++ 计数器部分

兼容这个词在这里似乎非常重要,因为在细节方面语义明显不同。例如,所有 C++ 屏障都是双向的,而 Java 的屏障不是(必然)。

  1. 大多数内存屏障也具有同步效应。那些特别依赖于其他线程中使用的屏障类型和先前执行的屏障指令。由于屏障指令的全部含义是特定于硬件的,因此我将坚持使用更高级别的 (C++) 屏障。例如,在 C++ 中,在释放屏障指令之前所做的更改对于执行获取屏障指令的线程是可见的。

我的假设正确吗?如果是这样,我产生的问题是:

  1. 可用的内存屏障是否VarHandle会导致任何类型的内存同步? …

java concurrency memory-model java-memory-model memory-barriers

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

Java:单反斜杠字符串 - 为什么“\\”非法?

我知道反斜杠用于字符转义,因此我必须使用其中两个反斜杠来编写单个反斜杠。

但为什么这不能编译呢?

"\\" => 无法编译

但是这个:

“\\\\”=>“\”

哪个\转义了什么?

先感谢您!

java regex escaping backslash

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