Added "Constructors are not Thread-Safe"
This commit is contained in:
parent
d360aa59e7
commit
bd6b0af400
18
concurrent/GuardedIDField.java
Normal file
18
concurrent/GuardedIDField.java
Normal file
@ -0,0 +1,18 @@
|
||||
// concurrent/GuardedIDField.java
|
||||
// (c)2017 MindView LLC: see Copyright.txt
|
||||
// We make no guarantees that this code is fit for any purpose.
|
||||
// Visit http://OnJava8.com for more book information.
|
||||
import java.util.concurrent.atomic.*;
|
||||
|
||||
public class GuardedIDField implements HasID {
|
||||
private static AtomicInteger counter =
|
||||
new AtomicInteger();
|
||||
private int id = counter.getAndAdd(1);
|
||||
public int getID() { return id; }
|
||||
public static void main(String[] args) {
|
||||
IDChecker.test(GuardedIDField::new);
|
||||
}
|
||||
}
|
||||
/* Output:
|
||||
0
|
||||
*/
|
8
concurrent/HasID.java
Normal file
8
concurrent/HasID.java
Normal file
@ -0,0 +1,8 @@
|
||||
// concurrent/HasID.java
|
||||
// (c)2017 MindView LLC: see Copyright.txt
|
||||
// We make no guarantees that this code is fit for any purpose.
|
||||
// Visit http://OnJava8.com for more book information.
|
||||
|
||||
public interface HasID {
|
||||
int getID();
|
||||
}
|
41
concurrent/IDChecker.java
Normal file
41
concurrent/IDChecker.java
Normal file
@ -0,0 +1,41 @@
|
||||
// concurrent/IDChecker.java
|
||||
// (c)2017 MindView LLC: see Copyright.txt
|
||||
// We make no guarantees that this code is fit for any purpose.
|
||||
// Visit http://OnJava8.com for more book information.
|
||||
import java.util.*;
|
||||
import java.util.function.*;
|
||||
import java.util.stream.*;
|
||||
import java.util.concurrent.*;
|
||||
import com.google.common.collect.Sets;
|
||||
|
||||
public class IDChecker {
|
||||
public static int SIZE = 100_000;
|
||||
static class MakeObjects
|
||||
implements Supplier<List<Integer>> {
|
||||
private Supplier<HasID> gen;
|
||||
public MakeObjects(Supplier<HasID> gen) {
|
||||
this.gen = gen;
|
||||
}
|
||||
@Override
|
||||
public List<Integer> get() {
|
||||
return
|
||||
Stream.generate(gen)
|
||||
.limit(SIZE)
|
||||
.map(HasID::getID)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
public static void test(Supplier<HasID> gen) {
|
||||
CompletableFuture<List<Integer>>
|
||||
groupA = CompletableFuture
|
||||
.supplyAsync(new MakeObjects(gen)),
|
||||
groupB = CompletableFuture
|
||||
.supplyAsync(new MakeObjects(gen));
|
||||
groupA.thenAcceptBoth(groupB, (a, b) -> {
|
||||
System.out.println(
|
||||
Sets.intersection(
|
||||
Sets.newHashSet(a),
|
||||
Sets.newHashSet(b)).size());
|
||||
}).join();
|
||||
}
|
||||
}
|
44
concurrent/SharedConstructorArgument.java
Normal file
44
concurrent/SharedConstructorArgument.java
Normal file
@ -0,0 +1,44 @@
|
||||
// concurrent/SharedConstructorArgument.java
|
||||
// (c)2017 MindView LLC: see Copyright.txt
|
||||
// We make no guarantees that this code is fit for any purpose.
|
||||
// Visit http://OnJava8.com for more book information.
|
||||
import java.util.concurrent.atomic.*;
|
||||
|
||||
interface SharedArg {
|
||||
int get();
|
||||
}
|
||||
|
||||
class Unsafe implements SharedArg {
|
||||
private int i = 0;
|
||||
public int get() { return i++; }
|
||||
}
|
||||
|
||||
class Safe implements SharedArg {
|
||||
private static AtomicInteger counter =
|
||||
new AtomicInteger();
|
||||
public int get() {
|
||||
return counter.getAndAdd(1);
|
||||
}
|
||||
}
|
||||
|
||||
class SharedUser implements HasID {
|
||||
private final int id;
|
||||
public SharedUser(SharedArg sa) {
|
||||
id = sa.get();
|
||||
}
|
||||
@Override
|
||||
public int getID() { return id; }
|
||||
}
|
||||
|
||||
public class SharedConstructorArgument {
|
||||
public static void main(String[] args) {
|
||||
Unsafe us = new Unsafe();
|
||||
IDChecker.test(() -> new SharedUser(us));
|
||||
Safe sa = new Safe();
|
||||
IDChecker.test(() -> new SharedUser(sa));
|
||||
}
|
||||
}
|
||||
/* Output:
|
||||
47747
|
||||
0
|
||||
*/
|
10
concurrent/StaticIDField.java
Normal file
10
concurrent/StaticIDField.java
Normal file
@ -0,0 +1,10 @@
|
||||
// concurrent/StaticIDField.java
|
||||
// (c)2017 MindView LLC: see Copyright.txt
|
||||
// We make no guarantees that this code is fit for any purpose.
|
||||
// Visit http://OnJava8.com for more book information.
|
||||
|
||||
public class StaticIDField implements HasID {
|
||||
private static int counter = 0;
|
||||
private int id = counter++;
|
||||
public int getID() { return id; }
|
||||
}
|
13
concurrent/TestStaticIDField.java
Normal file
13
concurrent/TestStaticIDField.java
Normal file
@ -0,0 +1,13 @@
|
||||
// concurrent/TestStaticIDField.java
|
||||
// (c)2017 MindView LLC: see Copyright.txt
|
||||
// We make no guarantees that this code is fit for any purpose.
|
||||
// Visit http://OnJava8.com for more book information.
|
||||
|
||||
public class TestStaticIDField {
|
||||
public static void main(String[] args) {
|
||||
IDChecker.test(StaticIDField::new);
|
||||
}
|
||||
}
|
||||
/* Output:
|
||||
47643
|
||||
*/
|
@ -67,7 +67,7 @@ project(':collections') {
|
||||
configure(subprojects - project(':onjava')) {
|
||||
dependencies {
|
||||
compile project(':onjava')
|
||||
compile 'com.google.guava:guava:21.0-rc2'
|
||||
compile 'com.google.guava:guava:21.0'
|
||||
compileOnly "org.openjdk.jmh:jmh-core:${jmh.jmhVersion}"
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user