20240221-线程池

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