文章目录
要想解决问题,就要知道哪些原因会导致出问题:(而且这些原因也是以后我们判断一个程序是否会有线程安全问题的标准)
A:是否有多线程环境
B:是否有共享数据
C:是否有多条语句操作共享数据
解决方式:同步代码块
格式:
synchronized(对象){
需要同步的代码;
}
注意:
A:同步可以解决安全问题的根本原因就在那个对象上,该对象如同锁的功能。
B:多线程必须是同一把锁
前面写的出票是有问题的,现在改进一下:
public class SellTicket implements Runnable {
// 定义一个共享变量
private int num = 100;
// 创建一个共享对象
private Object ob = new Object();
public void run() {
while (true) {
synchronized (ob) {//同步
if (num > 0) {
System.out.println(Thread.currentThread().getName() + "正在出售第" + num-- + "张电影票!");
}
}
}
}
}
public class SellTicketDemo {
public static void main(String[] args) {
SellTicket st=new SellTicket();
//定义Thread对象
Thread s1=new Thread(st,"窗口1");
Thread s2=new Thread(st,"窗口2");
Thread s3=new Thread(st,"窗口3");
s1.start();
s2.start();
s3.start();
}
}
同步的特点:
前提:
A:多线程
B:多线程使用的是同一个锁对象
好处:
同步的出现解决了多线程的安全问题
弊端:
当多线程相当多时,因为每一个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率。