测试线程安全代码针对锁ID实现

测试线程安全代码

package com.game.exe;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.ReentrantLock;
/**
 * 测试线程安全方法
 * @author gaoyannan
 * 20210513
 */
public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String userId_a = "userId_a";
		String userId_b = "userId_b";
		String userId_c = "userId_c";
		String userId_d = "userId_d";
		String userId_e = "userId_e";
		String userId_f = "userId_f";
		int count = 10000 * 100;
		long startTime = System.currentTimeMillis();

		thread1(userId_a, count);
		thread2(userId_b, count);
		thread3(userId_c, count);
		thread4(userId_d, count);
		thread5(userId_e, count);
		thread6(userId_f, count);
		EXECUTOR_SERVICE.shutdown();
		while (true) {// 等待所有任务都执行结束
			if (EXECUTOR_SERVICE.isTerminated()) {// 所有的子线程都结束了
				System.err.println("共耗时:" + (System.currentTimeMillis() - startTime) / 1000.0 + "s");
				break;
			}
		}
		System.err.println(userId_a + " 线程不安全 没有锁 i1==" + i1);
		System.err.println(userId_b + "  线程安全 synchronized (CHM.get(userId)) 锁userId i2==" + i2);
		System.err.println(userId_c + "  线程安全 synchronized (userId.intern()) 锁userId i3==" + i3);
		System.err.println(userId_d + "  线程安全 synchronized void count4 锁所有 i4==" + i4);
		System.err.println(userId_e + "  线程安全 synchronized (Test.class) 锁所有 i5==" + i5);
		System.err.println(userId_f + "  线程安全 lock.lock(); 锁所有 i6==" + i6);
		
	}
	/**
	 * 公平锁
	 */
	private static final ReentrantLock lock = new ReentrantLock(true);
	private static final ExecutorService EXECUTOR_SERVICE = Executors.newCachedThreadPool();
	static {// 添加钩子 确保 关闭jar前线程池的任务运行完毕
		Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {

			public void run() {
				try {
					EXECUTOR_SERVICE.shutdown();
				} catch (Exception e) {
					// TODO: handle exception
					e.printStackTrace();
				}

			}
		}));
	}
	public static int i1 = 0;
	public static int i2 = 0;
	public static int i3 = 0;
	public static int i4 = 0;
	public static int i5 = 0;
	public static int i6 = 0;
	public static final ConcurrentHashMap<String, String> CHM = new ConcurrentHashMap<String, String>();

	/**
	 * 线程不安全
	 */
	public static void thread1(String userId, int count) {
		for (int i = 0; i < count; i++) {
			EXECUTOR_SERVICE.execute(new Runnable() {

				@Override
				public void run() {
					// TODO Auto-generated method stub
					count1(userId);
				}
			});
		}

	}

	/**
	 * 线程安全
	 */
	public static void thread2(String userId, int count) {
		CHM.put(userId, userId);
		for (int i = 0; i < count; i++) {

			EXECUTOR_SERVICE.execute(new Runnable() {

				@Override
				public void run() {
					// TODO Auto-generated method stub
					count2(userId);

				}
			});
		}

	}

	/**
	 * 线程安全
	 */
	public static void thread3(String userId, int count) {
		for (int i = 0; i < count; i++) {
			EXECUTOR_SERVICE.execute(new Runnable() {

				@Override
				public void run() {
					// TODO Auto-generated method stub

					count3(userId);

				}
			});
		}

	}

	/**
	 * 线程安全
	 */
	public static void thread4(String userId, int count) {
		for (int i = 0; i < count; i++) {
			EXECUTOR_SERVICE.execute(new Runnable() {

				@Override
				public void run() {
					// TODO Auto-generated method stub

					count4(userId);

				}
			});
		}

	}

	/**
	 * 线程安全
	 */
	public static void thread5(String userId, int count) {
		for (int i = 0; i < count; i++) {
			EXECUTOR_SERVICE.execute(new Runnable() {

				@Override
				public void run() {
					// TODO Auto-generated method stub

					count5(userId);

				}
			});
		}

	}
	/**
	 * 线程安全
	 */
	public static void thread6(String userId, int count) {
		for (int i = 0; i < count; i++) {
			EXECUTOR_SERVICE.execute(new Runnable() {

				@Override
				public void run() {
					// TODO Auto-generated method stub

					count6(userId);

				}
			});
		}

	}

	/**
	 * 线程不安全 锁不住
	 */
	public static void count1(String userId) {

		i1++;
	}

	/**
	 * 线程安全 锁userId
	 */
	public static void count2(String userId) {
		synchronized (CHM.get(userId)) {
			i2++;
		}

	}

	/**
	 * 线程安全 锁userId
	 */
	public static void count3(String userId) {
		synchronized (userId.intern()) {
			i3++;
		}
	}

	/**
	 * 线程安全 锁所有
	 */
	public static synchronized void count4(String userId) {
		i4++;

	}

	/**
	 * 线程安全 锁所有
	 */
	public static synchronized void count5(String userId) {
		synchronized (Test.class) {// 锁所有
			i5++;
		}
	}
	/**
	 * 线程安全 锁所有
	 * @param userId
	 */
	public static void count6(String userId) {
		try {
			lock.lock();
			i6++;
			//lock.unlock();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		} finally {
			// TODO: handle finally clause
			if (lock.isLocked()) {
				lock.unlock();
			}
		}
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值