静态方法和线程安全中的局部变量

Dae*_*Han 21 java static thread-safety

我对变量范围有疑问.

例如:

class A {
    private static void test() {
        // do something with local variables
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我创建两个线程,并A为每个线程创建一个实例.

  1. 当我test()在每个线程中调用时,我可以保证test()线程安全吗?

  2. test()存储的本地变量在哪里?每个线程的堆栈?堆空间?

PS我知道静态在这种情况下完全没有意义.我在遗留代码中找到了它; 我只是想确定我所知道的!

Ero*_*rol 30

局部变量存储在每个线程自己的堆栈中.这意味着线程之间永远不会共享局部变量.这也意味着所有本地原始变量都是线程安全的.

对象的本地引用有点不同.引用本身不共享.但是,引用的对象不存储在每个线程的本地堆栈中.所有对象都存储在共享堆中.如果本地创建的对象永远不会转义它创建的方法,那么它是线程安全的.事实上,只要这些方法或对象都不会使传递的对象可用于其他线程,您也可以将其传递给其他方法和对象.

对象成员与对象一起存储在堆上.因此,如果两个线程在同一对象实例上调用方法,并且此方法更新对象成员,则该方法不是线程安全的.

线程安全检查:如果资源是在同一线程的控制下创建,使用和处置的,并且永远不会逃避对该线程的控制,则该资源的使用是线程安全的.

来自:http://tutorials.jenkov.com/java-concurrency/thread-safety.html

  • +1,虽然你当然可以'传递',(信号),对象到其他线程,但创建它的线程通常应该'放弃它的所有权',例如.通过将其自己的引用置零或通过创建另一个对象来覆盖它,以便两个线程永远不能对同一个对象进行操作.如果不这样做,则按照您的描述共享对象,并且需要锁才能进行访问. (3认同)