一、原因:多个线程共用了一个数据(共享的语句有多条,一个线程使用cpu,没有使用完,cpu被抢走了,当再次抢到cpu的时候,接着执行后面的语句,造成了错误的发生);
二、如何解决?
答:在代码中使用同步代码块(同步锁),解释,在某一段任务中,同一时间只允许一个线程执行任务,其他的线程即使抢到了cpu,也无法进入当前的任务区,只有当当前的线程将任务执行完后,其他的线程才能进入;
三、作为锁对象的要求:1.必须是对象 2.必须保证被多个线程共享
例如:一个普通的对象、当前对象的引用---this、类的字节码文件
四、同步代码块的特点:1.可以保证线程的安全 2.由于每次都要进行判断处理,所以降低了执行效率
五、什么时候使用同步代码块?
1.多个线程共享一个数据
2.至少有两个线程
六、售票问题
class Ticket implements Runnable{
//让大家共享数据
int num = 20;
boolean wan = false;
public void run() {
while (!wan) {
if (num > 0) {
System.out.println(Thread.currentThread().getName()+" "+num--);
}else {
wan = true;
}
}
}
}
public class Demo3{
public static void main(String[] args) {
//1.创建任务类对象
Ticket ticket = new Ticket();
//2.创建线程
//如果我们自己创建了任务类,线程会优先调用我们自己的run方法,不会再去调用Thread内部的run方法
Thread thread1 = new Thread(ticket);
Thread thread2 = new Thread(ticket);
Thread thread3 = new Thread(ticket);
Thread thread4 = new Thread(ticket);
//3.开始执行线程
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
}