一. 多线程基本原则:
1. 原子性:防止出现竞态条件(个人理解)。竞态条件:某个计算结果依赖于多个线程的交替进行,这时就会出现静态条件!
2. 可见性:修改状态后,其它线程可以看到状态的变化 ( volatile是一种轻量级的同步工具,volatile变量总可以读到变量最新的值,从而实现了可见性。写volatile变量相当于退出同步代码(瞬发),读volatile变量相当于进入同步代码 )
3. 一致性:
二. 多线程基本方法:
1. sleep 停止sleep所在线程若干时间,该动作不释放锁,不影响其它线程运行
2. join 在主线程中启动另外一个线程,主线程必须等待该线程运行结束之后才能继续运行
3. yeild 放弃时间片,使各线程重新竞争
三. 同步,锁
同步的贡献:1 保证原子性,2 保证可见性
首先明确一下锁的生命周期:获取锁,运行代码,释放锁 (注意能造成阻塞的只能是 同一把锁)
1 对象的内置锁:
每一个java对象都有一个唯一的锁(和实例11对应),该锁由synchronized关键字实现,线程进入代码块获取锁,出代码立即释放锁。
可以在方法声明中加 synchronized、代码内部加synchronized(synchronized (this){do sth})、
2 锁的重入性:
对于java来讲,阻塞的粒度是线程而不是调用,线程运行的内部不会出现锁的竞争。
3 同步性能优化:
应该把同步代码块中不影响共享变量且执行时间较长的代码独立出去