volatile 的实验
用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;@SneakyThrowspublic static void main(String[] args) {final CountDownLatch latch = new CountDownLatch(THREADS_COUNT);for (int i = 0; i < THREADS_COUNT; i++) {new Thread(new Runnable() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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);}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
