并发编程学习小结

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

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值