今天是2014.12.18,又要开始抢火车票了。突然想到刚刚学习的毕向东老师的多线程。那在这人说一说,和学习的盆友们一起交流。
需求:
火车票售票的例子是解释多线程的好例子。主要用来解释多线程的线程安全问题。知道的朋友都知道,这里需要实现Runnable接口,怎么才能避免线程安全隐含呢?
解决方案:同步
何时同步呢?如何正确使用同步?
1. 大于等于两个线程
2. 所有线程使用同一个锁。
同步的意思就是为当前线程加锁(锁旗标),这个锁根据不同的同步方式又分别有不同的要求。具体在每一个同步方式中展开讲述。
同步有两种方式:
1.同步代码
格式:
synchronized(对象) {
...//代码块
}
同步代码块的锁为任意类的实例。比如Object的对象,或this指向的对象,或某类的字节码对象(就是编译后的.class文件)等等。
2.同步方法(同步方法又分为非静态方法和静态方法,这又有所不同)
非静态同步方法格式1:
作用域(如public) synchronized 函数名() {
}
非静态同步方式的锁是this。
静态同步方法
作用域(如public) synchronized 函数名() {
}
静态同步方法使用的锁是该类的字节码对象。格式:类名.class。
锁就像火车里的厕所一样,当线程执行同步代码或同步函数的时候,就会锁住该区域,其他线程无法获得该部分的操作权。就像厕所指示灯显示“有人”,只有该锁被释放以后,其他线程才有机会操作该同步的部分。 |
|