测试线程安全代码
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();
}
}
}
}