线程状态
- 新生状态
- 可运行状态
- 运行状态
- 阻塞状态
- 等待状态
- 终止状态
线程同步
- 同步代码块
- 同步方法
- 锁机制
同步代码块
把访问的共享数据锁起来,保证线程安全
synchronized关键字可以用于方法中的某个区块中,表示对这个区块的资源实行互斥访问
//锁对象,必须是一个唯一的对象(同一个地址)
synchronized(锁对象)
//...访问共享数据的代码...
}
**锁对象:**对象的同步锁只是一个概念,可以想象为在任意对象上标记了一个锁
建议把共享资源作为锁对象,不要随便讲无关的对象当作锁对象
对于实例方法,建议把this作为锁对象
对于静态方法,建议把类的字节码(类名.class)当作锁对象
CountDownLatch
:一种同步辅助工具,允许一个或者多个线程等待,直到其他线程中执行的一组操作完成
CountDownLatch latch = new CountDownLatch(10);
latch.countDown();//每一个线程运行结束,数量减一
latch.await();//等到这个计数器中的数字清空
同步方法
使用synchronized
修饰的方法就叫做同步方法,保证该线程在执行丰富的时候,其他的线程只能在方法外等着
同步方法就是将整个方法锁住,一个线程调用这个方法,另一个线程调用的时候就执行不了,只有等上一个线程调用结束,下一个线程调用才可以继续执行
同步方法也有锁对象,只不过锁对象没有显示的写出来而已
1.对于实例方法,锁对象其实是this(也就是方法的调用者)
2.对于静态方法,锁对象时类的字节码对象(类名.class)
同步代码块和同步方法的区别:
1.不存在哪个好与不好,只是一个锁住的范围大,一个锁住的范围小
2.同步方法是将方法中所有的代码锁住
3.同步代码块是方法中的部分代码锁住
Lock锁
在JDK 5
中引入了ReentrantLock
, ReentrantLock
重入锁,是实现Lock接口的一个类,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞,支持公平锁和非公平锁两种方式。
- public void lock() :加同步锁
- public void unlock():释放同步锁