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);}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部