/*
线程安全问题产生发原因:
1 多个线程在操作同一个数据
2 操作共享数据的线程代码有多条
当一个线程在执行操作共享数据的多条代码过程中 其他线程参与了运算
就会导致线程安全问题的产生
解决思路:
就是将多条操作共享数据的线程代码封装起来,当有线程在执行这些代码的时候
其他线程不可以参与运算
必须要当前线程把这些代码都执行完毕后,其他线程才可以参与运算
在Java中 用同步代码块就可以解决这个问题
同步代码块的格式:
synchronized(对象){
需要被同步的代码;
}
同步的好处:解决了线程安全问题
同步的弊端:相对降低了效率 因为同步外的线程都会判断同步
同步的前提:必须有多个线程并使用同一个锁
*/
class Ticket implements Runnable{
private int num=100;
Object obj=new Object();
public void run(){
//Object obj=new Object(); 如果在这里则不是用同一把锁(每人一把锁)
while(true){
synchronized(obj){//(锁) 同步这里面的代码块需要一起执行 类似火车卫生间 只能一次进一个
if(num>0){//cpu 运行到这里 判断>0后 运行下一个线程 下一个线程将num--
//cpu 回来时不需要判读>0(已经判断过了) 直接num-- 会出现-1 -2 (错误)
try{
Thread.sleep(10);
}
catch(InterruptedException e){
}
System.out.println(Thread.currentThread().getName()+"--sale="+num--);
}
}
}
}
}
class ThreadDemo{
public static void main(String[] args) {
Ticket t=new Ticket();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
Thread t3=new Thread(t);
t1.start();
t2.start();
t3.start();
}
}
Java 同步问题2
最新推荐文章于 2022-10-07 10:52:54 发布