Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果我的值存储在线程安全映射中,那么该值是否需要为ThreadLocal?_Java_Multithreading_Spring_Spring Transactions - Fatal编程技术网

Java 如果我的值存储在线程安全映射中,那么该值是否需要为ThreadLocal?

Java 如果我的值存储在线程安全映射中,那么该值是否需要为ThreadLocal?,java,multithreading,spring,spring-transactions,Java,Multithreading,Spring,Spring Transactions,我将对象存储在ThreadLocalMap(在spring tx中实现) 类事务同步管理器。。。 私有静态本地资源= 新命名的线程本地(“事务资源”); 如果映射是ThreadLocal并且被正确访问(同样是所有spring tx代码),那么我存储在映射中的值必须是ThreadLocal才能保证线程安全吗?假设您没有通过其他方式无意中将映射传递给另一个线程,映射不需要任何额外的保护,因为它的所有用途都是单线程的。同样,只要映射中的任何对象没有通过其他方式无意中传递给其他线程,这些对象就不需要任

我将对象存储在
ThreadLocal
Map
(在spring tx中实现)

类事务同步管理器。。。
私有静态本地资源=
新命名的线程本地(“事务资源”);

如果映射是
ThreadLocal
并且被正确访问(同样是所有spring tx代码),那么我存储在映射中的值必须是ThreadLocal才能保证线程安全吗?

假设您没有通过其他方式无意中将映射传递给另一个线程,映射不需要任何额外的保护,因为它的所有用途都是单线程的。同样,只要映射中的任何对象没有通过其他方式无意中传递给其他线程,这些对象就不需要任何额外的保护。

如果是线程本地的,为什么需要同步呢?@DaveNewton我不是说关键字意义上的
synchronized
,或者我是说。。。映射不是我的实现,我只是在其中添加值,我只是试图传达对映射本身的所有访问都是线程安全的,哪些线程正在访问映射?这取决于您如何处理映射中的对象。例如,如果您有一个以线程安全方式检索的映射引用,那么如何修改该引用?线程安全映射中的对象不是线程安全的,对映射的访问是线程安全的。
class TransactionSynchronizationManager ...

private static final ThreadLocal<Map<Object, Object>> resources =
        new NamedThreadLocal<Map<Object, Object>>("Transactional resources");