用CountDownLatch写的:输出56656
import lombok.SneakyThrows;
import java.util.concurrent.CountDownLatch;
public class VolatileTest {
public static volatile int race = 0;
public static void increase() {
race++;
}
private static final int THREADS_COUNT = 20;
@SneakyThrows
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(THREADS_COUNT);
for (int i = 0; i < THREADS_COUNT; i++) {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
increase();
}
latch.countDown();
}
}).start();
}
latch.await();
System.out.println(race);
// Thread[] threads = new Thread[THREADS_COUNT];
// for (int i = 0; i < THREADS_COUNT; i++) {
// threads[i] = new Thread(new Runnable() {
// @Override
// public void run() {
// for (int i = 0; i < 10000; i++) {
// increase();
// }
// }
// });
// threads[i].start();
// }
等待所有累加线程都结束
// while (Thread.activeCount() > 1)
// Thread.yield();
// System.out.println(race);
}
}
以下是使用 Lock 重写的代码: 输出 200000
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Counter {
private static int race = 0;
private static final int THREADS_COUNT = 20;
private static Lock lock = new ReentrantLock();
public static void increase() {
lock.lock();
try {
race++;
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
Thread[] threads = new Thread[THREADS_COUNT];
for (int i = 0; i < THREADS_COUNT; i++) {
threads[i] = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
increase();
}
}
});
threads[i].start();
}
for (int i = 0; i < THREADS_COUNT; i++) {
try {
threads[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(race);
}
}
用Semaphore 重写一遍: 输出 200000
import java.util.concurrent.Semaphore;
public class Counter {
private static int race = 0;
private static final int THREADS_COUNT = 20;
private static Semaphore semaphore = new Semaphore(1);
public static void increase() {
try {
semaphore.acquire();
race++;
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
}
}
public static void main(String[] args) {
Thread[] threads = new Thread[THREADS_COUNT];
for (int i = 0; i < THREADS_COUNT; i++) {
threads[i] = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
increase();
}
}
});
threads[i].start();
}
for (int i = 0; i < THREADS_COUNT; i++) {
try {
threads[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(race);
}
}