• 并发编程学习小结


           前段时间由于项目需要,自己设计了个线程池的框架,结合工厂模式,能够支持业务根据各自业务量的需要,定制自己线程池的大小。虽然通过这个对并发编程已经有了一定的了解,但是个人认为自己目前对于java的并发编程只是局限于使用和浅层的了解阶段,在这里先对自己这段时间的学习做个总结。

           首先,一般java多线程的实现,有两种方式,继承Thread类,或者实现runnable接口,但是基本上都是使用的实现runnable接口的方式,这样能够避免遇到java的单继承的局限。我们可以使用Thread对象的start()方法启动一个线程,同时,在线程跑的过程中,我们还可以使用Thread对象的sleep()方法使一个线程进入休眠状态,A线程还可以使用Thread对象的interrupt()方法中断B线程(中断是使B线程继续往下走,如休眠状态会被唤醒抛出中断异常)。

           对于线程阻塞,有四种情况会导致线程阻塞问题,使用了sleep方法、使用了wait方法、使用了read方法(会阻塞到字节流读完为止)、阻塞在获取某个有排他性的资源。

            volatile是一种弱同步机制,修饰的变量在多线程的时候,JVM每次都会从主存中读取该变量的值,并且当该变量的值变化时,都会强迫将该值写回到主存当中,所以使用了这个变量后,效率会降低。而synchronize修饰的同步机制叫互斥锁机制,它所获得的锁叫互斥锁。每个对象都有一个锁标记,当线程拥有这个锁标记时才能访问这个资源。对于synchronize和volatile关键字,当且仅当满足如下两个条件时,volatile变量才能保证其安全性:

    1. 对变量的写入操作不依赖变量的当前值

    2. 该变量没有包含在其他变量的不变式中

    在需要同步的时候,一般第一选择synchronize关键字,这是最安全的方式,使用其他任何方式都是有风险的。

           对于死锁,我们一定要遵循以下规则:

    1. 只在最短的时间内持有锁,考虑使用同步语句块代替整个方法同步

    2. 尽量不要写同一时刻需要持有多个锁的代码

    3. 创建和使用一个大锁代替若干个小锁

           使用wait/notify方法需要注意早期遗漏问题,需要配合全局变量做判断,如果notify方法并没有唤醒另外一个线程(早期遗漏等原因),则通过这个boolean类型的全局变量做while循环,直到成功通知为止。

    (16、17)

           

  • 相关阅读:
    校招失败后,在小公司熬了 2 年终于进了华为,竭尽全力....
    刷题记录:牛客NC16708[NOIP2002]过河卒
    在LEAP系统中,如果我想预测中国天然气需求,除了考虑人口、城镇化率、GDP等五个因素还需要考虑其他因素吗?
    Java设计模式-创建者模式-单例模式
    数商云采购系统解决方案 | 建筑工程行业采购管理之招标业务场景应用
    springboot自定义注解防止表单重复提交
    STM32CubeMX教程19 I2C - MPU6050驱动
    就业喜报:产品岗位提升的底层能力是产品思维
    2019上半年-2019下半年软件设计师上午题错题总结
    LayaBox---TypeScript---类型兼容性
  • 原文地址:https://blog.csdn.net/JordanInShenzhen/article/details/52950573