Skip to content

Commit 3c6201c

Browse files
carryxyhbeiwei30
authored andcommitted
Fix bug in InternalThreadLocal and provides unit test (#1803)
* SerializerFactory 获取Serializer时,锁住整个hashmap,导致整个过程被block * 单元测试。保证一个class只有一个serializer和deserializer。单线程和多线程测试 * 增加线程数 50 模拟多个线程来获取serializer和deserializer * 当cores线程数全都使用的情况下,默认线程池会把任务放入到队列中。队列满则再创建线程(总数不会超过Max线程数) 增强线程池:在请求量阶段性出现高峰时使用 特性:cores线程全部使用的情况下,优先创建线程(总数不会超过max),当max个线程全都在忙的情况下,才将任务放入队列。请求量下降时,线程池会自动维持cores个线程,多余的线程退出。 * 当cores线程数全都使用的情况下,默认线程池会把任务放入到队列中。队列满则再创建线程(总数不会超过Max线程数) 增强线程池:在请求量阶段性出现高峰时使用 特性:cores线程全部使用的情况下,优先创建线程(总数不会超过max),当max个线程全都在忙的情况下,才将任务放入队列。请求量下降时,线程池会自动维持cores个线程,多余的线程退出。 * 补全单元测试,测试扩展是否生效 * 错误命名 * 增加@OverRide注解 long 初始化赋值时,小写l改为大写L防止误读 * 修复单元测试 * remove enhanced * remove enhanced * Faster ThreadLocal impl in internal use * Used in RpcContext`s LOCAL field. * Faster get than the traditional ThreadLocal * add License * fix ci failed * fix ci failed * fix ci failed * fix ci failed * fix ci failed * remove author info * fix destroy method * fix bug at method size. * Unit test for InternalThreadLocal * Unit test for InternalThreadLocal Fix bug in method removeAll
1 parent 71366d6 commit 3c6201c

File tree

3 files changed

+92
-1
lines changed

3 files changed

+92
-1
lines changed

dubbo-common/src/main/java/com/alibaba/dubbo/common/threadlocal/InternalThreadLocal.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ public static void removeAll() {
5858
Object v = threadLocalMap.indexedVariable(variablesToRemoveIndex);
5959
if (v != null && v != InternalThreadLocalMap.UNSET) {
6060
Set<InternalThreadLocal<?>> variablesToRemove = (Set<InternalThreadLocal<?>>) v;
61-
for (InternalThreadLocal<?> tlv : variablesToRemove) {
61+
InternalThreadLocal<?>[] variablesToRemoveArray =
62+
variablesToRemove.toArray(new InternalThreadLocal[variablesToRemove.size()]);
63+
for (InternalThreadLocal<?> tlv : variablesToRemoveArray) {
6264
tlv.remove(threadLocalMap);
6365
}
6466
}

dubbo-common/src/test/java/com/alibaba/dubbo/common/threadlocal/InternalThreadLocalTest.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,32 @@ public void run() {
6161
Thread.sleep(2000);
6262
}
6363

64+
@Test
65+
public void testRemoveAll() throws InterruptedException {
66+
final InternalThreadLocal<Integer> internalThreadLocal = new InternalThreadLocal<Integer>();
67+
internalThreadLocal.set(1);
68+
Assert.assertTrue("set failed", internalThreadLocal.get() == 1);
69+
70+
final InternalThreadLocal<String> internalThreadLocalString = new InternalThreadLocal<String>();
71+
internalThreadLocalString.set("value");
72+
Assert.assertTrue("set failed", "value".equals(internalThreadLocalString.get()));
73+
74+
InternalThreadLocal.removeAll();
75+
Assert.assertTrue("removeAll failed!", internalThreadLocal.get() == null);
76+
Assert.assertTrue("removeAll failed!", internalThreadLocalString.get() == null);
77+
}
78+
79+
@Test
80+
public void testSize() throws InterruptedException {
81+
final InternalThreadLocal<Integer> internalThreadLocal = new InternalThreadLocal<Integer>();
82+
internalThreadLocal.set(1);
83+
Assert.assertTrue("size method is wrong!", InternalThreadLocal.size() == 1);
84+
85+
final InternalThreadLocal<String> internalThreadLocalString = new InternalThreadLocal<String>();
86+
internalThreadLocalString.set("value");
87+
Assert.assertTrue("size method is wrong!", InternalThreadLocal.size() == 2);
88+
}
89+
6490
@Test
6591
public void testSetAndGet() {
6692
final Integer testVal = 10;
@@ -70,6 +96,33 @@ public void testSetAndGet() {
7096
Objects.equals(testVal, internalThreadLocal.get()));
7197
}
7298

99+
@Test
100+
public void testRemove() {
101+
final InternalThreadLocal<Integer> internalThreadLocal = new InternalThreadLocal<Integer>();
102+
internalThreadLocal.set(1);
103+
Assert.assertTrue("get method false!", internalThreadLocal.get() == 1);
104+
105+
internalThreadLocal.remove();
106+
Assert.assertTrue("remove failed!", internalThreadLocal.get() == null);
107+
}
108+
109+
@Test
110+
public void testOnRemove() {
111+
final Integer[] valueToRemove = {null};
112+
final InternalThreadLocal<Integer> internalThreadLocal = new InternalThreadLocal<Integer>() {
113+
@Override
114+
protected void onRemoval(Integer value) throws Exception {
115+
//value calculate
116+
valueToRemove[0] = value + 1;
117+
}
118+
};
119+
internalThreadLocal.set(1);
120+
Assert.assertTrue("get method false!", internalThreadLocal.get() == 1);
121+
122+
internalThreadLocal.remove();
123+
Assert.assertTrue("onRemove method failed!", valueToRemove[0] == 2);
124+
}
125+
73126
@Test
74127
public void testMultiThreadSetAndGet() throws InterruptedException {
75128
final Integer testVal1 = 10;
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
package com.alibaba.dubbo.common.threadlocal;
19+
20+
import org.junit.Assert;
21+
import org.junit.Test;
22+
23+
public class NamedInternalThreadFactoryTest {
24+
25+
@Test
26+
public void newThread() throws Exception {
27+
NamedInternalThreadFactory namedInternalThreadFactory = new NamedInternalThreadFactory();
28+
Thread t = namedInternalThreadFactory.newThread(new Runnable() {
29+
@Override
30+
public void run() {
31+
32+
}
33+
});
34+
Assert.assertTrue("thread is not InternalThread", t.getClass().equals(InternalThread.class));
35+
}
36+
}

0 commit comments

Comments
 (0)