我正在开发一个严重依赖泛型类型的项目.它的一个关键组件是所谓的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 …
在试图了解SubmissionPublisher(Java SE 10 中的源代码,OpenJDK | docs),在版本 9 中添加到 Java SE 的新类是如何实现的,我偶然发现了一些VarHandle我以前不知道的API 调用:
fullFence,acquireFence,releaseFence,loadLoadFence和storeStoreFence。
在做了一些研究之后,特别是关于内存屏障/栅栏的概念(我以前听说过它们,是的;但从未使用过它们,因此对它们的语义非常不熟悉),我想我对它们的用途有了基本的了解. 尽管如此,由于我的问题可能源于误解,我想确保我首先做对了:
内存屏障是关于读写操作的重新排序约束。
内存屏障可以分为两大类:单向和双向内存屏障,这取决于它们是否对读取或写入或两者都设置了约束。
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 的屏障不是(必然)。
我的假设正确吗?如果是这样,我产生的问题是:
可用的内存屏障是否VarHandle会导致任何类型的内存同步? …
java concurrency memory-model java-memory-model memory-barriers
我知道反斜杠用于字符转义,因此我必须使用其中两个反斜杠来编写单个反斜杠。
但为什么这不能编译呢?
"\\" => 无法编译
但是这个:
“\\\\”=>“\”
哪个\转义了什么?
先感谢您!
java ×3
backslash ×1
concurrency ×1
escaping ×1
generics ×1
java-8 ×1
lambda ×1
memory-model ×1
regex ×1