并行程序设计小结

单线程:

1.实现runnable接口,extends thread ,重写run方法(run方法里面是先执行的方法,需等待后再执行当前线程)。
2.实现callerable接口,重写call方法,public call(){},T是基本类型的包装类,通过list装结果。(带返回值的单线程)。

单线程通过调用static方法来调用,线程过程为:创建->就绪->运行->阻塞->停止

为实现线程同步,两种方法:

1.加锁
2.实现原子操作

三种加锁方式:

1.同步锁 :sycnchronized,可加在方法上,当多个线程访问这个方法时,只有一个线程可进入。
2.同步块:synchronized{},使用this对当前对象加锁,可以进行嵌套,里面还可以加另一个同步锁。
3.可重入锁:(reenTrantLock)可以显式加锁、解锁,功能更多。可判断锁是否被持有。公平策略获得锁
lock.lock()
try{
}finally{
lock unlock()(解锁)
}

读写锁:多个读(并发)一个写(reentrantwritelock/reentrankreadlock),判断当前是读操作还是写操作,读操作加读锁,写操作,加写锁。

wait、notify、notifyall通常和synchronized联用。
1.wait让线程等待某个同步锁,前提是要有同步锁,释放锁 2.sleep也是线程等待,但是不释放线程锁
1.notify唤醒某个正在等待的线程。2.notifyall唤醒所有正在等待的线程,让他们公平竞争,只有一个线程得到该锁。
await、signal、signalall通常和lock联用。

lock和synchronize的区别。

1.synchronized是系统关键字的实现,系统级别实现属于重量级实现,在竞争压力不大的情况下,效率较高。
2.lock属于程序设计的实现,属于应用级别,也就是轻量级实现,在竞争压力大的情况下,效果更佳。
(1)trylock试着锁等一系列新增的线程同步方法。
(2)使用起来更简单不容易出现死锁

扫描二维码关注公众号,回复: 4692310 查看本文章

生产者和消费者的问题

猜你喜欢

转载自blog.csdn.net/classics_moon/article/details/85255761