首页 > 试题广场 >

关于ThreadLocal类以下说法正确的是?

[不定项选择题]
关于ThreadLocal 以下说法正确的是
  • ThreadLocal继承自Thread
  • ThreadLocal实现了Runnable接口
  • ThreadLocal重要作用在于多线程间的数据共享
  • ThreadLocal是采用哈希表的方式来为每个线程都提供一个变量的副本
  • ThreadLocal保证各个线程间数据安全,每个线程的数据不会被另外线程访问和破坏
推荐
选DE.
1、ThreadLocal的类声明:
public class ThreadLocal<T>
可以看出ThreadLocal并没有继承自Thread,也没有实现Runnable接口。所以AB都不对。
2、ThreadLocal类为每一个线程都维护了自己独有的变量拷贝。每个线程都拥有了自己独立的一个变量。
所以ThreadLocal重要作用并不在于多线程间的数据共享,而是数据的独立,C选项错。
由于每个线程在访问该变量时,读取和修改的,都是自己独有的那一份变量拷贝,不会被其他线程访问,
变量被彻底封闭在每个访问的线程中。所以E对。
3、ThreadLocal中定义了一个哈希表用于为每个线程都提供一个变量的副本:
 static class ThreadLocalMap {

        static class Entry extends WeakReference<ThreadLocal> {
            /** The value associated with this ThreadLocal. */
            Object value;

            Entry(ThreadLocal k, Object v) {
                super(k);
                value = v;
            }
        }

        /**
         * The table, resized as necessary.
         * table.length MUST always be a power of two.
         */
        private Entry[] table;
}
所以D对。
编辑于 2016-04-08 23:55:49 回复(20)
Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。

发表于 2015-10-25 14:52:28 回复(3)
ThreadLocal继承Object,相当于没继承任何特殊的。
ThreadLocal没有实现任何接口。
ThreadLocal并不是一个Thread,而是Thread的局部变量。
发表于 2015-11-24 22:24:44 回复(3)

当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。

从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。

所以,在Java中编写线程局部变量的代码相对来说要笨拙一些,因此造成线程局部变量没有在Java开发者中得到很好的普及。

ThreadLocal的接口方法

ThreadLocal类接口很简单,只有4个方法,我们先来了解一下:

  • void set(Object value)设置当前线程的线程局部变量的值。
  • public Object get()该方法返回当前线程所对应的线程局部变量。
  • public void remove()将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。
  • protected Object initialValue()返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的。这个方法是一个延迟调用方法,在线程第1次调用get()或set(Object)时才执行,并且仅执行1次。ThreadLocal中的缺省实现直接返回一个null。

值得一提的是,在JDK5.0中,ThreadLocal已经支持泛型,该类的类名已经变为ThreadLocal<T>。API方法也相应进行了调整,新版本的API方法分别是void set(T value)、T get()以及T initialValue()。

ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单:在ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应线程的变量副本

发表于 2017-04-18 10:36:18 回复(1)
答案:DE
ThreadLocal类代表一个线程局部变量,通过把数据放在ThreadLocal中让每个线程创建一个该变量副本,避免并发访问的线程安全问题
编辑于 2016-04-08 23:55:40 回复(0)
选DE. 1、ThreadLocal的类声明: public class ThreadLocal<T> 可以看出ThreadLocal并没有继承自Thread,也没有实现Runnable接口。所以AB都不对。 2、ThreadLocal类为每一个线程都维护了自己独有的变量拷贝。每个线程都拥有了自己独立的一个变量。 所以ThreadLocal重要作用并不在于多线程间的数据共享,而是数据的独立,C选项错。 由于每个线程在访问该变量时,读取和修改的,都是自己独有的那一份变量拷贝,不会被其他线程访问, 变量被彻底封闭在每个访问的线程中。所以E对。 3、ThreadLocal中定义了一个哈希表用于为每个线程都提供一个变量的副本:  static class ThreadLocalMap {         static class Entry extends WeakReference<ThreadLocal> {             /** The value associated with this ThreadLocal. */             Object value;             Entry(ThreadLocal k, Object v) {                 super(k);                 value = v;             }         }         /**          * The table, resized as necessary.          * table.length MUST always be a power of two.          */         private Entry[] table; } 所以D对。
发表于 2017-09-12 23:08:44 回复(0)
DE.ThreadLocal主要作用是数据的独立,保证了并发时线程的安全性,因为每个线程都会创建一个独立的副本,它并不继承Thread类也不实现Runnable接口。
发表于 2015-08-10 11:32:30 回复(0)
threadlocal本来就不是一个线程,所以不会继承自thread也不会实现与runnable接口,由名字我们可以知道线程本地或者局部就是用于各线程之间的数据隔离的,他实现的原理就是使用了一个哈希表来管理每个线程的变量的副本,从而实现了数据在线程的独立。
发表于 2017-10-28 17:14:52 回复(0)
threadlocalmap是threadlocal的内部类,thread类有一个threadlocalmap类型的成员变量
发表于 2017-12-03 15:38:24 回复(0)
对D来说,ThreadLocal的实现确实使用了哈希表的思想和方法,但是这里的哈希表不是直接使用HashMap,而是重新定义了ThreadLocalMap,  ThreadLocalMap内部使用Entry实现。

发表于 2015-09-11 23:46:04 回复(0)
ThreadLocal继承Object,相当于没继承任何特殊的。 ThreadLocal没有实现任何接口。 ThreadLocal并不是一个Thread,而是Thread的局部变量。 可以这么理解: Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。
发表于 2021-11-02 21:39:11 回复(0)
ThreadLocal继承Object,相当于没继承任何特殊的。
ThreadLocal没有实现任何接口。
ThreadLocal并不是一个Thread,而是Thread的局部变量。
可以这么理解:
Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。
发表于 2018-10-26 22:03:56 回复(0)
ThreadLocal类为每一个线程都维护了自己独有的变量拷贝。每个线程都拥有了自己独立的变量。所以ThreadLocal类的重要作用在于线程之间数据的独立。ThreadLocal定义了一个哈希表用于为每个线程都提供一个变量的副本。
发表于 2018-10-13 09:51:58 回复(0)
1、 ThreadLocal重要作用并不在于多线程间的数据共享,而是数据的独立。
2、 每个线程在访问该变量时,读取和修改的,都是自己独有的那一份变量拷贝,不会被其他线程访问,
变量被彻底封闭在每个访问的线程中。
3、 ThreadLocal中定义了一个哈希表用于为每个线程都提供一个变量的副本。
发表于 2021-05-04 21:03:58 回复(0)
可以看出ThreadLocal并没有继承自Thread,也没有实现Runnable接口。所以AB都不对。 2、ThreadLocal类为每一个线程都维护了自己独有的变量拷贝。每个线程都拥有了自己独立的一个变量。 所以ThreadLocal重要作用并不在于多线程间的数据共享,而是数据的独立,C选项错。
发表于 2020-10-01 11:10:34 回复(0)
E,Thread类中一个ThreadLocalMap,线程创建时默认没有没有初始化,只有在一个线程里通过共享变量ThreadLocal的get()才会初始化该Thread类里的ThreadLocalMap,而ThreadLocalHashMap是通过数组的方式实现,ThreadLocal只是作为key。
发表于 2020-03-30 18:34:06 回复(0)
72%头像 72%
ThreadLocal继承自Object;
ThreadLocal主要用于线程隔离,因此用哈希表为每个线程提供了一个变量的拷贝;

发表于 2019-12-14 18:18:25 回复(0)

threadlocal为每个线程维护了独立的变量拷贝,不是实现共享,而是单独享用

发表于 2019-05-26 22:45:37 回复(0)
ThreadLocal并没有继承Thread,也没有实现Runnable接口
ThreadLocal作用不在于多线程间的数据共享,而是数据的独立
每个线程在访问该变量时,读取和修改的,都是自己独有的那一份变量拷贝,不会被其他线程访问,
变量被彻底封闭在每个访问的线程中。

发表于 2019-01-25 10:54:36 回复(0)
ThreadLocal继承自java.lang.Object,故A错;ThreadLocal没有实现Runnable接口,故B错;ThreadLocal用于线程间的数据隔离,故C错,选DE。
编辑于 2018-12-19 17:10:41 回复(0)
TreadLocal继承Object,并不是一个Thread,而是局部变量
发表于 2018-10-17 20:32:26 回复(0)