Java并发编程二三事
作者:Katsura 发布时间:[ 2016/9/1 11:38:21 ] 推荐标签:并发编程 Java
典型的工作线程结构
下面是典型的工作线程结构,注意中断监测和异常处理,并且在finally中做一些资源回收的工作。
1 /**
2 * 典型线程池工作者线程结构
3 */
4 public void run() {
5 Throwable thrown = null;
6 try {
7 while (!Thread.currentThread().isInterrupted()) {
8 // Run task...
9 }
10 } catch (Throwable e) {
11 thrown = e;
12 } finally {
13 // Exited the thread...
14 }
15 }
ReentrantLock
synchronized使用对象内置的监视器进行同步,这已经可以满足绝大多数的开发情况。如果你还需要更加灵活的锁,比如实现有时限的堵塞,或 者需要在无法获得锁的时候进行一些处理,那么你可以使用ReentrantLock。比如下面的tryLock方法,它在能够获取锁的时候返回true, 不能获取锁的时候返回false,而不会堵塞进程。
1 /**
2 * tryLock() 如果能够获得锁即获得锁并返回true,否则返回false
3 */
4 public void tryLock() {
5 final int[] data = {0};
6 ReentrantLock lock1 = new ReentrantLock();
7 ReentrantLock lock2 = new ReentrantLock();
8
9 Thread thread1 = new Thread(new Runnable() {
10 @Override
11 public void run() {
12 boolean tag = false;
13 for(int i = 0; i < 10; i++) {
14 try {
15 Thread.sleep(500);
16 } catch (InterruptedException e) {
17 e.printStackTrace();
18 }
19 while (true) {
20 if (lock1.tryLock()) {
21 try {
22 if (lock2.tryLock()) {
23 try {
24 data[0]++;
25 System.out.println("++");
26 tag = true;
27 } finally {
28 lock2.unlock();
29 }
30 }
31 } finally {
32 lock1.unlock();
33 }
34 }
35
36 if (tag) {
37 tag = false;
38 break;
39 }
40 }
41 }
42 }
43 });
44
45 Thread thread2 = new Thread(new Runnable() {
46 @Override
47 public void run() {
48 boolean tag = false;
49 for(int i = 0; i < 10; i++) {
50 try {
51 Thread.sleep(400);
52 } catch (InterruptedException e) {
53 e.printStackTrace();
54 }
55 while (true) {
56 if (lock2.tryLock()) {
57 try {
58 if (lock1.tryLock()) {
59 try {
60 data[0]--;
61 System.out.println("--");
62 tag = true;
63 } finally {
64 lock1.unlock();
65 }
66 }
67 } finally {
68 lock2.unlock();
69 }
70 }
71
72 if (tag) {
73 tag = false;
74 break;
75 }
76 }
77 }
78 }
79 });
80
81 thread1.start();
82 thread2.start();
83
84 try {
85 thread1.join();
86 } catch (InterruptedException e) {
87 e.printStackTrace();
88 }
89 try {
90 thread2.join();
91 } catch (InterruptedException e) {
92 e.printStackTrace();
93 }
94
95 System.out.println(data[0]);
96 }
Condition
如果有两个条件谓词在同一个同步对象上使用wait()和notify()进行资源的堵塞等待,那么即有可能会发生信号的丢失,导致死锁。对于这种 情况,要么是用notifyAll()通知等待队列中的进程,这样效率会稍微低一些;另一种方法是使用锁的Condition,
1 /**
2 * Condition
3 */
4 class ConditionBoundeBuffer<T> {
5 protected final Lock lock = new ReentrantLock();
6
7 private final Condition notFull = lock.newCondition();
8 private final Condition notEmpty = lock.newCondition();
9
10 private final T[] items = (T[]) new Object[3];
11 private int tail, head, count;
12
13 public void put(T x) throws InterruptedException {
14 lock.lock();
15 try {
16 while (count == items.length) {
17 notEmpty.await();
18 }
19 items[tail] = x;
20 if (++tail == items.length)
21 tail = 0;
22 ++count;
23 notEmpty.signal();
24 } finally {
25 lock.unlock();
26 }
27 }
28
29 public T take() throws InterruptedException {
30 lock.lock();
31 try {
32 while (count == 0) {
33 notEmpty.await();
34 }
35 T x = items[head];
36 items[head] = null;
37 if (++head == items.length) {
38 head = 0;
39 }
40 --count;
41 notFull.signal();
42 return x;
43 } finally {
44 lock.unlock();
45 }
46 }
47 }
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
Java性能测试有哪些不为众人所知的原则?Java设计模式??装饰者模式谈谈Java中遍历Map的几种方法Java Web入门必知你需要理解的Java反射机制知识总结编写更好的Java单元测试的7个技巧编程常用的几种时间戳转换(java .net 数据库)适合Java开发者学习的Python入门教程Java webdriver如何获取浏览器新窗口中的元素?Java重写与重载(区别与用途)Java变量的分类与初始化JavaScript有这几种测试分类Java有哪四个核心技术?给 Java开发者的10个大数据工具和框架Java中几个常用设计模式汇总java生态圈常用技术框架、开源中间件,系统架构及经典案例等
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南