• 并发编程学习小结


           前段时间由于项目需要,自己设计了个线程池的框架,结合工厂模式,能够支持业务根据各自业务量的需要,定制自己线程池的大小。虽然通过这个对并发编程已经有了一定的了解,但是个人认为自己目前对于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)

           

  • 相关阅读:
    Spring核心问题回顾1:ioc容器创建的大致过程、bean的生命周期、解决循环依赖为什么需要三级缓存
    android: android:onClick=“@{() -> listener.onItemClick(viewModel)}“
    请求的转发和重定向
    阿里云服务器经济型e实例租用价格和CPU性能测评
    第九章:面向对象编程(高级部分)
    SpringBoot 自定义注解异步记录复杂日志
    安装pandas==0.22.0时的问题
    Java 初学者必备核心基础知识有哪些?
    QT GUI编程常用控件学习
    7、Tomcat & Servlet
  • 原文地址:https://blog.csdn.net/JordanInShenzhen/article/details/52950573