最后一个例子
来源:6-2 J.U.C之AQS-CountDownLatch
高秋
2019-02-24
这个例子在多线程环境下,类似这样的static变量v1传入到线程run方法,是否是被子线程共享的,因为我记得变量作为参数传进来会被copy一份,不知道这里会不会被copy?而要堆栈封锁,必须要子线程自己new出来的vector对象?希望老师给予回答一下,最好加上原理和例子~
写回答
1回答
-
你好,这个问题本质上不是以多线程作为出发点来分析的,而是与两点有关系:1、变量作用域,2、值传递还是引用传递有关系。
基于这个我们具体讨论一下:
1、如果不传参数,直接使用static修饰的变量,这时其实就是子线程共享变量,就是课程里最开始演示那种情况,每个线程的工作内存里都会有一个副本,操作不当会存在线程安全问题。
2、如果传参数,分两种:值传递和引用传递。引用传递从根本上讲传递的是内存里的引用,每次修改都改的同一处内存里的值,这时虽然传到其他方法里,但实际上操作的仍然是同一块内存地址;值传递就相对简单了,每次都是复制后使用。(这两个属于java基础里的内容,如果不熟悉的话,赶紧补一下java基础)
3、问题里提到了堆栈封闭,这个根本就是变量的作用域只存在于一个方法堆栈里(白话就是方法里new一个对象使用),其实也是和作用域有关。10
相似问题