传递给python函数线程的变量是否安全?

时间:2017-01-13 08:39:14

标签: python

对python来说并不陌生,但这已经让我感到困扰了一段时间。如果我把mystring作为一个字符串传递给一个函数:

def func(mystring):
     print(mystring)
     #do other things to mystring 

func被很多线程调用,是mystring线程安全吗?或者当另一个线程调用func时它的值是否可以改变?

我的想法是它不应该是因为mystring是不可变的。我知道可变对象不是线程安全的,但是不可变对象怎么样?

1 个答案:

答案 0 :(得分:3)

希望如果我错了,我会得到纠正,但我相信答案是 - if(spaces.get(spaceKey) != null){ return spaces.get(spaceKey).getGigaSpace(); } return null; } 是线程安全的。来自this post

  

局部变量肯定是“线程独占的”。没有其他线程可以直接访问它们,这是有用的,但不足以保证语义线程安全。

     

一个线程中的局部变量不会将其值存储在与另一个线程中同名的局部变量相同的位置。

     

这基本上是函数和局部变量定义的直接结果。或多或少每种结构化编程语言都具有如下内容:

     
      
  • 每次调用一个函数时,都会分配一个称为堆栈帧的新内存块(当函数返回时它会变为无效/被破坏)。

  •   
  • 局部变量的值存储在该堆栈帧中。

  •   

作为局部变量,每个调用mystring的线程都会将func的值存储在其他线程无法访问的位置。本文接着指出线程排他性必要足够以确保线程安全:

  

但是,保证两个线程对局部变量具有单独的存储空间不足以确保线程安全,因为这些局部变量可以以线程不安全的方式引用全局共享数据。

但是,在这种情况下,您不依赖或修改任何全局共享数据; mystring引用一个只能在本地访问且不可引导的字符串对象。

在线程排他性与缺乏交互/依赖全局状态之间,我相信它是线程安全的。