Java并发开篇

记得在一个月前的面试中被面试官问道,聊聊你对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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值