目录
1.什么情况下需要同步?
-
当多线程并发,有多段代码同时执行时,我们希望某一段代码执行的过程中CPU不要切换到其他线程工作,这时就需要同步。
-
如果两段代码是同步的,那么同一时间只能执行一段,在一段代码没执行结束之前,不会执行另外一段代码.
2.同步代码块
-
把操作共享数据的代码锁起来
synchronized ( 锁 ){ 操作共享数据的代码 }
-
特点
-
锁默认打开,有一个线程进去了,锁自动关闭
-
里面的代码全部执行完毕,线程出来,锁自动打开
-
-
锁对象:任意对象,但是必须唯一的,使用static修饰。
-
synchronized必须在循环内,不然只有一个线程在操作
-
锁对象必须时唯一。
3.同步方法
-
就是把synchronized关键字加到方法上
修饰符 synchronized 返回类型 方法名( 方法参数 ){......}
-
特点
-
同步方法时锁住方法里面所有的代码
-
锁对象不能自己指定
-
非静态:this
-
静态:当前类的字节码文件对象
-
-
4.案例(售票问题)
class Ticket implments Runnable {
private static int ticket = 100;
public void run() {
while (true) {
synchronized(Ticket.class){
if(ticket <= 0) {
break;
}
try {
Thread. sleep(10) ;
//线程1睡,线程2睡,线程3睡,线程4睡
} catch (InterruptedException e) {
e.printstackTrace() ;
}
System. out. println (getName() + ".. .这是第”+ ticket-- + "号票") ;
}
}
}
}