20240221-线程池
ccnaive 2024/2/21
# 1 线程池
# 小灿白话聊聊线程池
# 相关代码:这里有坑后续会说
package com.example.leetcode.ThreadPool;
import java.util.concurrent.locks.ReentrantLock;
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
for (int j = 10; j > 0; j--) {
new Thread(() -> {
for (int i = 10; i > 0; i--) {
increment();
System.out.println("count = " + count);
}
}).start();
}
}
static int count = 0;
static ReentrantLock lock = new ReentrantLock();
public static void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
}
# 这是正确加锁后的代码:
上面代码有问题:
1.打印没有加锁
2.++和打印要看成一个整体
package com.example.leetcode.ThreadPool;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockTest {
public static void main(String[] args) {
for (int j = 10; j > 0; j--) {
new Thread(() -> {
for (int i = 10; i > 0; i--) {
lock.lock();
//这里的新增和打印需要看成一个整体,如果分开加锁,就还是会有问题呀
//比如我++了,然后释放了++锁,还没来得及打印,别的线程也开始++
try {
increment();
sout();
} finally {
lock.unlock();
}
}
}).start();
}
}
static int count = 0;
static Lock lock = new ReentrantLock();
public static void increment() {
count++;
}
public static void sout() {
System.out.println("count = " + count);
}
}
# 继续聊聊多线程
# 第二天
这里我觉得有一个很妙的地方,就是这里只创建了一个全局的类变量threadLocal,却可以做到每个线程的数据都互不干扰,其原因是:当线程操作threadLocal时,线程会创建一个自己的threadLocalMap用来存储(key是threadLocal的实例,value是需要存入的值)
这里需要进行手动remove