记得在一个月前的面试中被面试官问道,聊聊你对java并发的理解,当时我只说出了几个关键字,线程池,接着面试官问我volatile实现原理,我在半年前看过一篇博客讲过然而忘记了,很失败(所以一回去就去恶补了原理),之后面试官问我,有用过concurrent包下的类吗?当时的我一脸懵逼。所以想写一个并发系列文章,主要还是内容的搜集吧。更新应该会挺慢的,慢慢来。
1 . volatile关键字修饰变量,保证了线程可以正确的读取其他线程写入的值
2 . Thread.yield()让线程让出处理器时间,处理器这时会重新去调度,这时候调度哪一个线程就不一定了
3 . Thread.currentThread.getName();获得当前线程名字
4 . 停止线程的方法是通过一个volatile修饰的变量keepRunning的布尔值来控制的,在其他线程中调用keepRunning = false;来停止
5 . 线程的join方法,其他线程会等待我调用join的这个线程执行完毕
Thread mThread = new Thread();
mThread.start();
mThread.join();
6 . 如何正确的停止JAVA中的线程
- 不能通过线程对象的stop方法来停止线程(stop会导致程序戛然而止,不能进行清理等工作)
- 停止线程的方法是通过一个volatile修饰的变量keepRunning的布尔值来控制的,在其他线程中调用keepRunning = false;来停止 (作用是可以让那一次的循环操作完整结束,还能进行一些收尾清理工作)
- Thread类的interrupt方法不能停止线程(见7)
7 . interrupted结合this.isInterrupted来停止线程,所有线程调用wait,sleep,join,再调用interrupted会使this.isInterrupted状态清除,并且抛出一个InterruptedException异常
8 . 进程间的交互(同步与互斥)
- 增加一个锁对象 private final Object lockObj = new Object(); synchronized(lockObj){…};来实现互斥,当代码块里面出现一些不符合的条件的时候,如if(temp < 0) return;这个时候我们像一种情况,如果频繁的的return;是不是也代表着频繁的加锁操作,这样会大大的降低程序执行的效率,一般我们的做法是把这句判断改为一个循环,如while(temp < 0) lockObj.wait();这句while循环,保证条件不满足的时候任务都会被阻挡,而不是继续去竞争CPU资源,在任务结束后,我们通知那些被阻止的线程,告诉它们情况已经改变了,lockObj.notifyAll();(notifyAll是唤醒Wait Set中全部的资源,notify是唤醒Wait Set里面的一条资源)来唤醒所有在lockObj对象上等待的线程,(当我们的调用wait,会等待在该对象的Wait Set中)
9 . 互斥:关键数据在同一时间只能被一个线程访问。synchronized实现
10 . 同步: 通过wait(),notify(),notifyAll()实现
接下来我继续研究以下几个方向
- java5中并发工具类,如concurrent包
- java内存模型(JMM)
- 多线程编程常用交互模型(Producer-Consumer模型. Read-Write Lock 模型. Future模型. Worker Thread模型)
- java死锁问题
- 线程安全性(原子性. 可见性)
- Locks&Condition