范例1:
package com.contoso;
import java.util.Enumeration;
import java.util.Vector;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class VectorExample1 {
public static void insertIfAbsent(Vector<Long> list, Long value) {
synchronized (list) {
boolean contains = list.contains(value);
if (!contains) {
list.add(value);
System.out.println(Thread.currentThread().getName() + " insertIfAbsent Value added: " + value);
}
}
}
/**
* 你可能会看到重复的值,尝试多运行几次并查看结果中的差异
*
*/
public static void insertIfAbsentUnsafe(Vector<Long> list, Long value) {
boolean contains = list.contains(value);
if (!contains) {
list.add(value);
System.out.println(Thread.currentThread().getName() + " insertIfAbsentUnsafe Value added: " + value);
}
}
public static void printVector(String name, Vector<Long> v) {
Enumeration<Long> elements = v.elements();
while (elements.hasMoreElements()) {
System.out.println(name + " " + elements.nextElement());
}
}
public static void insertUnsafe() {
ExecutorService executor = Executors.newCachedThreadPool();
// Synchronized - Vector
Vector vector = new Vector<Long>();
Runnable insertIfAbsentUnsafe = () -> {
long millis = System.currentTimeMillis() / 1000;
insertIfAbsentUnsafe(vector, millis);
};
for (int i = 0; i < 1000000; i++) {
executor.execute(insertIfAbsentUnsafe);
}
executor.shutdown();
printVector("insertIfAbsentUnsafe", vector);
}
public static void insertSafe() {
ExecutorService executor = Executors.newCachedThreadPool();
// Synchronized - Vector
Vector vector = new Vector<Long>();
Runnable insertIfAbsent = () -> {
long millis = System.currentTimeMillis() / 1000;
insertIfAbsent(vector, millis);
};
for (int i = 0; i < 1000000; i++) {
executor.execute(insertIfAbsent);
}
executor.shutdown();
printVector("insertIfAbsent", vector);
}
public static void main(String[] args) throws InterruptedException {
insertSafe();
insertUnsafe();
}
}
run:
pool-1-thread-1 insertIfAbsent Value added: 1571847216
pool-1-thread-209 insertIfAbsent Value added: 1571847217
pool-1-thread-1535 insertIfAbsent Value added: 1571847218
insertIfAbsent 1571847216
insertIfAbsent 1571847217
insertIfAbsent 1571847218
pool-2-thread-1 insertIfAbsentUnsafe Value added: 1571847218
pool-2-thread-656 insertIfAbsentUnsafe Value added: 1571847219
pool-2-thread-657 insertIfAbsentUnsafe Value added: 1571847219
pool-2-thread-654 insertIfAbsentUnsafe Value added: 1571847219
pool-2-thread-782 insertIfAbsentUnsafe Value added: 1571847220
pool-2-thread-682 insertIfAbsentUnsafe Value added: 1571847220
pool-2-thread-778 insertIfAbsentUnsafe Value added: 1571847220
pool-2-thread-781 insertIfAbsentUnsafe Value added: 1571847220
pool-2-thread-680 insertIfAbsentUnsafe Value added: 1571847220
insertIfAbsentUnsafe 1571847218
insertIfAbsentUnsafe 1571847219
insertIfAbsentUnsafe 1571847219
insertIfAbsentUnsafe 1571847219
insertIfAbsentUnsafe 1571847220
insertIfAbsentUnsafe 1571847220
insertIfAbsentUnsafe 1571847220
insertIfAbsentUnsafe 1571847220
insertIfAbsentUnsafe 1571847220
BUILD SUCCESSFUL (total time: 4 seconds)