分别使用原子变量、synchronized关键字、ReentrantLock实现计数器

package class10;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

//使用synchronized 实现计数器
public class SyncCounter {
	private int count = 0;

	public synchronized void increase() {
		count++;
	}

	public int getCount() {
		return count;
	}

	public static void main(String[] args) {
		final SyncCounter aor = new SyncCounter();
		// 线程池
		ExecutorService exec = Executors.newCachedThreadPool();
		// 模拟20个客户端访问
		for (int index = 0; index < 20; index++) {
			Runnable run = new Runnable() {
				public void run() {
					aor.increase();
					int result = aor.getCount();
					System.out.println(result);
				}
			};
			exec.execute(run);
		}
		// 退出线程池
		exec.shutdown();

	}
}

package class10;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

//原子Integer 实现计数器
public class AtomicCounter {
	// 原子Integer递增对象
	public static AtomicInteger atomicInteger = new AtomicInteger(0);

	public static void main(String[] args) {
		// 线程池
		ExecutorService exec = Executors.newCachedThreadPool();
		// 模拟50个客户端访问
		for (int index = 0; index < 20; index++) {
			Runnable run = new Runnable() {
				public void run() {
					atomicInteger.getAndIncrement();
					System.out.println(atomicInteger);
				}
			};
			exec.execute(run);
		}
		// 退出线程池
		exec.shutdown();
		System.out.println(atomicInteger);
	}
}

package class10;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.ReentrantLock;

//使用ReentrantLock实现计数器
public class ReentrantLockTest {
	private ReentrantLock lock = new ReentrantLock();
	private int count;

	public void increase() {
		lock.lock();
		count++;
		try {
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				System.err.println(Thread.currentThread().getName() + " interrupted");
				Thread.currentThread().interrupt();
			}
		} finally {
			lock.unlock();
		}
	}

	public int getCount() {
		return count;
	}

	public static void main(String[] args) {
		final ReentrantLockTest reentrantLockTest = new ReentrantLockTest();
		// 线程池
		ExecutorService exec = Executors.newCachedThreadPool();
		// 模拟20个客户端访问
		for (int index = 0; index < 20; index++) {
			Runnable run = new Runnable() {
				public void run() {
					reentrantLockTest.increase();
					int result = reentrantLockTest.getCount();
					System.out.println(result);
				}
			};
			exec.execute(run);
		}
		// 退出线程池
		exec.shutdown();
		System.out.println(reentrantLockTest.getCount());
	}

}


你可能感兴趣的:(分别使用原子变量、synchronized关键字、ReentrantLock实现计数器)