1.JUC是什么
java.util.concurrent在并发编程中使用的工具类
进程/线程回顾
1)进程:在操作系统中既是基本的分配单元,也是基本的执行单元
2)线程:一个进程至少包含一个或者以上的线程,是进程中独立运行
目录
和独立调度的基本单位
例子:Word文档编辑是一个进程,在编辑过程中会有语法检测拼写,这就是语法检测线程
3)线程状态
NEW 创建一个线程,但是还未启动
RUNNABLE 在JVM中的可运行状态
BLOCKED 阻塞
WAITING 无限等待
TIMED_WAITING 有限等待
TERMINATED 结束
4)sleep和wait的区别
wait是object的方法、sleep是thread的方法
wait释放锁,sleep不释放锁
5)并发/并行
并发:同一时刻,多个线程访问同一个资源,例如:春运抢票,秒杀商品
并行:多项工作一起执行,之后汇总,例如:泡方便面
2.Lock接口
1)多线程编程模板:线程 操作 资源类
2)实现步骤:创建资源类;资源类里创建同步方法、同步代码块
Synchronized理解:
连环8问,如果能答出来,说明理解透了synchronize
一部iPhone有发短信,发邮件功能(资源类)张三与李四都想要使用这部手机:
1 标准访问,先打印短信还是邮件 2 停4秒在短信方法内,先打印短信还是邮件 3 普通的hello方法,是先打短信还是hello 4 现在有两部手机,先打印短信还是邮件 5 两个静态同步方法,1部手机,先打印短信还是邮件 6 两个静态同步方法,2部手机,先打印短信还是邮件 7 1个静态同步方法,1个普通同步方法,1部手机,先打印短信还是邮件 8 1个静态同步方法,1个普通同步方法,2部手机,先打印短信还是邮件
1)张三与李四都想要使用这部手机(相当于两个线程竞争一个资源类),张三想要用手机发短信,李四想要用手机发邮件,那么,此时,如果张三获取到手机(竞争到锁,获取到资源。并锁定),那么李四只能等待(wait)张三发送完短信。
相当于,在一个资源类里的方法加了synchronize,那么这个资源类一次只能有一个线程去获取到被synchronize修饰的方法。
2)如果此时张三竞争到了手机发短信,此时李四依旧可以使用手机上所带的手机壳等其他不是手机自带属性的东西。
相当于,一个资源类里有普通方法,一个synchronize修饰的方法,此时另一个线程调用该资源类的普通方法不会受影响。
3)如果此时有两部手机,发短信,发邮件分别再两部手机上,此时,张三,李四分别使用两部手机互不影响。
相当于,一个资源类,有两个实例,那么这两个实例的synchronize修饰的方法,不会受影响。
4)极端情况,如果资源类中是静态(static)synchronize修饰的方法,此时,相当于,手机设计时就设定了一个属性,并且不能被更改。
相当于,iPhone手机,设定一个功能,只能先发短信(static synchronize method)之后,才能发邮件(static synchronize method)
5)极端情况2,如果资源类中有一个静态(static)synchronize修饰的方法(相当于类级别) + 一个普通synchronize方法(相当于实例级别)。
相当于,手机设计图,有一个方法(static synchronize),手机制造商根据这个设计图,制造出手机(实例),那么张三使用这部手机时,实例中的synchronize修饰的方法与类(class)中的synchronize互不影响。
总结:
synchronize会锁住实例对象中的所有同步(synchronize修饰)方法,锁颗粒度不够细,不能够灵活控制锁资源的位置。