线程安全问题

一、原因:多个线程共用了一个数据(共享的语句有多条,一个线程使用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();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值