并发编程学习小结

Posted JordanInShenzhen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发编程学习小结相关的知识,希望对你有一定的参考价值。

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

       

以上是关于并发编程学习小结的主要内容,如果未能解决你的问题,请参考以下文章

并发编程学习小结

《java并发编程的艺术》学习小结

《java并发编程的艺术》学习小结

并发编程学习Java 内存模型

Java并发编程:volatile关键字解析

java并发编程--内存模型