多线程变量应用,主要关注两个概念【主线程变量】、【子线程变量】
(根据作用拟的名称,有些文章中用 【局部变量】、【线程变量】)
主线程变量:主要指主线程中声明的变量、参数,这些变量在子线程中引用时,它的值是不确定的。
子线程变量:主要指子线程作用域内的变量,这里子线程作用域包含了,子线程所在代码块的同一个作用域。
注:这里的解释是自己理的,不全完精确,但有用。
注:对于 子线程变量的另一个解释是:用lambda表达式传递线程参数是一个闭包操作,编译器会自动帮我们生成一个类,这个类包含了要传递的参数,用作线程启动参数。但是,如果在多个lambda表达式中使用相同的变量,它们会共享这些变量,最后导致变量值错乱。
在多线程编程中,变量的使用不合理会导致程序执行异常,比如(仅参考):
以上代码,如果在也外部是异步使用时,并发量较大的情况下会有问题
解决方案是:线程依赖的参数 全部用声明为 子线程变量
(简单讲,就是在线程代码前 再定义一个变量,线程内只使用新定义的变量)
详细的代码分析 案例
如果简单了解 只需要关注 变量i 和 变量y 的不同就可以了
另注:以上代码中 x和y 即是 子线程变量,又是 主线程变量,证明结果如:
实际执行中,x 相当于 两个变量 两个值,
在主线程中 x 的值 会是 顺序的 0到9,看sx输出结果
在子线程中 x 的值 会是 乱序的 0到9,看各行的输出结果
建议的 解决方案
参考代码 1:
参考代码 2: