File tree Expand file tree Collapse file tree 2 files changed +30
-4
lines changed
src/main/java/com/example/concurrency Expand file tree Collapse file tree 2 files changed +30
-4
lines changed Original file line number Diff line number Diff line change 3
3
/**
4
4
* @author zed
5
5
* 上下文切换测试类
6
- * 1、结论 循环数量在百万级别时 并发处理速度才会领先,说明上下文切换的存在
7
- * 2、使用vmstat 查看测量上下文切换次数得出 1000次/s
6
+ * 1、结论 循环数量在百万级别时 并发处理速度才会领先,说明上下文切换的存在以及线程创建的成本
7
+ * 2、使用Lmbench3 测量上下文切换时长, 使用vmstat 查看测量上下文切换次数上下文速度 1000次/s
8
8
* 3、减少上下文切换
9
- * 1)无锁并发编程-》数据ID按照Hash算法取模分段 不同线程处理不同数据
9
+ * 1)无锁并发编程-》多线程锁竞争会引起切换,可以通过数据ID按照Hash算法取模分段 不同线程处理不同数据避免使用锁
10
10
* 2)CAS算法
11
11
* 3)协程:在单线程里实现多任务调度,并在单线程里维持多个任务的切换
12
+ * 4)使用最少线程
12
13
*
13
14
*/
14
15
public class ContentSwitchTest {
Original file line number Diff line number Diff line change 1
1
package com .example .concurrency .visibility ;
2
2
3
+ import com .example .concurrency .threadPool .ThreadPoolBuilder ;
4
+ import com .example .concurrency .util .ThreadUtil ;
5
+ import lombok .extern .slf4j .Slf4j ;
6
+
7
+ import java .util .concurrent .ThreadPoolExecutor ;
8
+
3
9
/**
4
10
* 描述:
5
11
* visibility 可见性问题
6
12
*
7
13
* @author zed
8
14
* @since 2019-06-13 9:05 AM
9
15
*/
16
+ @ Slf4j
10
17
public class Visibility {
11
18
private static long count = 0 ;
12
19
private void add10K () {
@@ -16,8 +23,25 @@ private void add10K() {
16
23
}
17
24
}
18
25
26
+ /**
27
+ * 通过boolean 变量更加直观
28
+ */
29
+ private static boolean flag = true ;
19
30
public static void main (String [] args ) {
20
- System .out .println (calc ());
31
+ // System.out.println(calc());
32
+
33
+ log .info ("我开始了" );
34
+ ThreadPoolExecutor threadPoolExecutor = ThreadPoolBuilder .fixedPool ().build ();
35
+ //线程开始
36
+ threadPoolExecutor .execute (() -> {
37
+ while (flag ){
38
+
39
+ }
40
+ log .info ("我退出了" );
41
+
42
+ });
43
+ ThreadUtil .sleep (100 );
44
+ flag = false ;
21
45
}
22
46
private static long calc (){
23
47
final Visibility visibility = new Visibility ();
@@ -39,6 +63,7 @@ private static long calc(){
39
63
Thread .currentThread ().interrupt ();
40
64
}
41
65
return count ;
66
+
42
67
}
43
68
44
69
}
You can’t perform that action at this time.
0 commit comments