我引用了Oracle关于Atomic Access的Java文档
- 读取和写入对于引用变量和大多数原始变量(除long和double之外的所有类型)都是原子的.
- 对于声明的所有变量
volatile(包括长变量和双变量),读取和写入都是原子的.
我明白是怎么volatile运作的.但是提到volatile明确声明for long和double变量以在第二个语句中获得原子访问的要求,是在第一个语句中volatile为引用变量和大多数原始变量(除long和double之外的所有类型)声明可选.
但我看到的代码使用原始类型的显式volatile声明int来实现原子访问; 而不这样做不保证原子访问.
int variable1; // no atomic access
volatile int variable2; // atomic access
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
在java.util.stream.Stream接口中,
<R> R collect(Supplier<R> supplier,
BiConsumer<R, ? super T> accumulator,
BiConsumer<R, R> combiner);
Run Code Online (Sandbox Code Playgroud)
组合器是a BiConsumer<R, R>,而在
<R, A> R collect(Collector<? super T, A, R> collector);
Run Code Online (Sandbox Code Playgroud)
组合器是一个BinaryOperator<A>只是一个BiFunction<A,A,A>.
虽然后面的形式清楚地定义了组合后组合对象的参考,但前一种形式却没有.
那么任何Stream实现库如何知道,前一种情况下的组合对象是什么?
下面的代码如何编译才不会出现错误?
var linkedList: MutableList<Int> = java.util.LinkedList()
Run Code Online (Sandbox Code Playgroud)
当java.util.LinkedList类契约显然没有实现 Kotlin 接口时MutableList?
java ×3
atomic ×1
collectors ×1
concurrency ×1
java-8 ×1
java-stream ×1
kotlin ×1
linked-list ×1
mapped-types ×1
mutablelist ×1
volatile ×1