package threaddemo;

/**
 * 类ThreadShareVariable演示了线程间共享变量的使用和潜在风险
 */
public class ThreadShareVariable {

    /**
     * 共享变量i，多个线程会访问和修改这个变量
     */
    public Integer i = 0;

    /**
     * 设置共享变量i的值
     *
     * @param i 新的变量值
     */
    public void setI(int i) {
        this.i = i;
    }

    /**
     * 获取共享变量i的值
     *
     * @return 当前的变量值
     */
    public int getI() {
        return i;
    }

    /**
     * 主函数演示了如何在多线程环境下使用共享变量，并展示了线程局部变量的用法
     *
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        ThreadShareVariable threadShareVariable = new ThreadShareVariable();

        // 使用ThreadLocal以线程为单位隔离变量i的值，避免共享变量的并发问题
        ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(threadShareVariable::getI);

        // 新建一个线程，该线程会修改共享变量i的值
        Thread thread = new Thread(() -> {
            threadShareVariable.setI(1);
        });

        // 新建一个线程，该线程会打印共享变量i的值
        new Thread(() -> {
            System.out.println("print i in new thread: " + threadShareVariable.getI());

        }).start();

        thread.start();
        try {
            // 等待线程thread执行完毕
            thread.join();
            // 打印共享变量i的值，预期为1
            System.out.println(threadShareVariable.getI());
            // 打印ThreadLocal中的值，此处的值是最原始的共享变量值0
            System.out.println("value in ThreadLocal: " + threadLocal.get());
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

    }
}
