多线程-为何ThreadLocal返回的值有相同的hashcode?

问题描述

为何ThreadLocal返回的值有相同的hashcode?

最近在研究多线程,研究到ThreadLocal的时候,修改了一个参考的类,做了测试,发现竟然有的时候ThreadLocal所返回的值有相同的hashcode,百思不得其解,求解答。
下面是代码:
public class TreadLocalTest {
private static ThreadLocalseqNum = new ThreadLocal() {
public A initialValue(){
return new A();
}
};
public A getA(){
// seqNum.set(seqNum.get());
return seqNum.get();
}
public static void main(String[] args){
TreadLocalTest sn = new TreadLocalTest();
TestClient t1 = new TestClient(sn);
TestClient t2 = new TestClient(sn);
TestClient t3 = new TestClient(sn);
TestClient t4 = new TestClient(sn);
t1.start();
t2.start();
t3.start();
t4.start();
}
private static class TestClient extends Thread {
private TreadLocalTest sn;
public TestClient(TreadLocalTest sn){
this.sn = sn;
}
public void run(){
for(int i=0;i<3;i++){
System.out.println("thread["+Thread.currentThread().getName()
+"]sn["+sn.getA().hashCode()+"]");
}
}
}

}

这是另一个类,很简单,没有代码
public class A {
}
有时候测试,四个线程都不一样的hashcode,但是有时候,就会出现如下结果:
发现Thread-1,Thread-2所返回的A类竟然有相同的hashcode,为何呢?
thread[Thread-0]sn[28737396]
thread[Thread-0]sn[28737396]
thread[Thread-0]sn[28737396]
thread[Thread-1]sn[6927154]
thread[Thread-1]sn[6927154]
thread[Thread-1]sn[6927154]
thread[Thread-2]sn[6927154]
thread[Thread-3]sn[5442986]
thread[Thread-2]sn[6927154]
thread[Thread-3]sn[5442986]
thread[Thread-2]sn[6927154]
thread[Thread-3]sn[5442986]

解决方案

我运行了你的代码,运行了很多次,出现过一次两个线程返回的A具有相同的hashCode,我也不清楚为什么。

代码结构可以调整一下,ThreadLocal直接放在Thread类中就可以了。

public class TreadLocalTest {

    private static class TestClient extends Thread {

        private ThreadLocal<A> seqNum = new ThreadLocal<A>() {
            public A initialValue() {
                return new A();
            }
        };

        public TestClient() {
        }

        public void run() {
            for (int i = 0; i < 3; i++) {
                System.out.println("thread[" + Thread.currentThread().getName()
                        + "]sn[" + seqNum.get().hashCode() + "]");
            }
        }
    }

    public static void main(String[] args) {
        TestClient t1 = new TestClient();
        TestClient t2 = new TestClient();
        TestClient t3 = new TestClient();
        TestClient t4 = new TestClient();
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
时间: 2024-09-12 10:45:50

多线程-为何ThreadLocal返回的值有相同的hashcode?的相关文章

求单选按纽的值,适用单选项及多选项。未选返回false;有选择项,返回选项值。

<form name="frm"><input type="radio" value="1" name="radioName"><input type="radio" value="2" name="radioName"><input type="button" onClick="alert(Ch

C#查询SqlServer数据库并返回单个值的方法

  本文实例讲述了C#查询SqlServer数据库并返回单个值的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 static public string GetSqlAsString(string sqlText, SqlParameter[] sqlParameters, string databaseConnectionString) { string result = ""; Sq

VLOOKUP函数返回错误值怎么办?

  VLOOKUP函数 返回错误值的原因和解决方法. 一. VLOOKUP函数基本语法 =VLOOKUP (lookup_value, table_array,col_index_num, [range_lookup]) 这个太复杂了哦,看鹅理解的VLOOKUP函数中文语法吧: =VLOOKUP(查找值,数据源,第几列,模糊查找1/精确查找0) 二. 实例说话 接下来,先看一个VLOOKUP函数的应用实例吧. 通过菜名查询库存数量. C11单元格公式如下: =VLOOKUP(B11,$B$3:$

AFN返回数据值为空,简单问题高悬赏

问题描述 AFN返回数据值为空,简单问题高悬赏 我发现 block里面的数据都是有的,也能打印出来,但是 返回的数据为空 我也知道是异步的问题 自己可以用block接收 但是目前急用 直接需要具体操作 因急用 100块求解决 QQ:396008684 解决方案 这是因为你return toke的时候,异步函数还没有返回,所以toke还没有 执行 toke=dicc[@"token"] 你可以在你的函数中增加一个参数,用block等,这样当异步返回的时候,调用block参数来把数据传递出

操作-asp.net第三方支付,提交成功也返回了支付成功,但是页面取不到返回的值,

问题描述 asp.net第三方支付,提交成功也返回了支付成功,但是页面取不到返回的值, 这样我没办法进行下一步的判断操作,request.querystring,取不到值啊 ,郁闷 解决方案 不知你调用第三方支付的方式,应该是访问第三方的网页,返回应该是html文本内容,调用第三方支付是在客户端还是在服务端?建议在服务端,应该解析返回的字符串,request.querystring是自己客户端发的请求,当然没值了. 解决方案二: 第三方支付,成功后会跳转到你站点某指定路径,并在URL带一些参数返

javascript-js获取css样式返回的值如何进行判断?

问题描述 js获取css样式返回的值如何进行判断? 比如返回了rbg(255,0,0),用直接字符串"rbg(255,0,0)"做相等判断似乎不行,返回false,不知道用什么方法可以做判断? 解决方案 返回了rbg(255,0,0),那么alert下返回值是显示什么的? 解决方案二: 返回值前后可能会有空格,所以判断会可能不相等 解决方案三: 返回的可能不是一个字符串,,typeof看看,,

ajax返回的值一直无法比较

问题描述 ajax返回的值一直无法比较 ajax返回的data与num的一直是false的.尝试了,typeof data和num ,输出的都是string.然后也尝试了toString()等.data == num反回的一直是false,请教一下大神们. function check(){ var num = ""yes""; $.ajax({ cache: false async: false url:""get_session_check.

c++ 传char*给lua 然后lua再返回char* 值不相同

问题描述 c++ 传char*给lua 然后lua再返回char* 值不相同 C++的代码: int main() { lua_State* L = luaL_newstate(); luaL_openlibs(L); luaL_dofile(L, "a.lua"); lua_getglobal(L, "test"); char* str = new char[3]; str[0] = 0; str[1] = 65; str[2] = 66; lua_pushstr

dialog-android怎么确定对话框返回的值是true还是false?

问题描述 android怎么确定对话框返回的值是true还是false? 似乎没有简单的方法获得一个警告框来返回一个简单的值. 下边的代码不起作用(答案变量不能设置在监听器里,事实上它甚至都没有编译) public static boolean Confirm(Context context) { boolean answer; AlertDialog dialog = new AlertDialog.Builder(context).create(); dialog.setTitle("Con