Java中的方法参数是否安全?
Class Shared{ public void sharedMethod(Object o){ //does something to Object } } //this is how threads call the shared method run(){ sharedInstance.sharedMethod(someObject); }
现在将o
作为参数传递给方法。 多个线程并行调用相同的方法。 我们可以安全地说这段代码是线程安全的吗?
有两种情况:
- 如果
someObject
在线程之间共享 - 如果每个Thread都有自己的
someObject
副本
不,你不能这么说。 方法参数是线程的本地参数,意味着每个都有自己的o
引用变量副本。但是如果你用多个线程中的同一个对象调用这个方法,那么参数将在它们之间共享(请记住Java是pass-by -值)。 在这种情况下,您需要提供显式同步以避免麻烦。
是的,但仅限于两种情况 :
- 如果你在
o
参数中传递的每个对象都是不可变的 , - 如果您的代码保证最多有一个线程处理
o
引用的对象。
否则 – 不 ,因为对象的内部状态可以由多个线程同时更改。
如果在多个线程中调用相同的方法,并将其传递给同一个对象,那么该对象绝对不安全。
创建线程时,它将创建自己的堆栈(方法和局部变量)。
两个线程将有两个堆栈,一个线程永远不会与任何其他线程共享其堆栈。
只有在同一个对象上调用它才会生效。
这样对待它。
如果您的线程不共享任何公共资源,那么就不可能出现并发问题。 从我们提供的信息中我们可以看出,唯一可以在这里分享的是someObject
。 如果它本身是线程安全的,或者是为每个线程复制的,那么除非代码是一般的线程安全的,否则除非有其他共享资源。
局部变量存储在每个线程自己的堆栈中。 这意味着局部变量永远不会在线程之间共享。 这也意味着所有本地原始变量都是线程安全的。
编辑
此示例中的LocalObject实例不从方法返回,也不传递给可从sharedMethod()
方法外部访问的任何其他对象。
执行sharedMethod()
方法的每个线程都将使用自己的Object o
作为参数。
所以,整个方法sharedMethod()
似乎是线程安全的。
当然,唯一的例外是,如果使用Object o
作为参数调用的方法之一,则以允许从其他线程访问它的方式存储Object o
实例。
- JAXB是否支持在不编组/解组的情况下修改现有XML文档?
- Spring MVC:ModelAndViewContainer:View是; 默认模型{Some-Object}
- java并发:很多作家,一个读者
- 在Java中将byte 写入文件
- 将名称空间设置为@XmlRootElement时,解组失败且没有错误
- 刷新/重新加载应用程序范围托管bean
- Jersey / REST – NoSuchMethodError:com.sun.jersey.core.reflection.ReflectionHelper.getContextClassLoaderPA()Ljava / security / PrivilegedAction;
- PowerMock:模拟静态方法(+在某些特定方法中返回原始值)
- 在Java中生成一个在JVM关闭后幸存的进程