同步代码块解决线程安全

来源:互联网 发布:ubuntu更新内核命令 编辑:程序博客网 时间:2024/06/04 18:06

需求:一辆车共50张票,三个窗口同时售票

class SaleTicket extends Thread{static int num=50;//票数Object o=new Object();public SaleTicket(String name){super(name);}@Overridepublic void run(){while(true){if(num>0){System.out.println(Thread.currentThread().getName()+"售出了第"+num+"号票");num--;}else{System.out.println("售罄了!");break;}}}}public class Sale{public static void main(String[] args){//创建三个线程,模拟三个窗口SaleTicket thread1=new SaleTicket("窗口1");SaleTicket thread2=new SaleTicket("窗口2");SaleTicket thread3=new SaleTicket("窗口3");//开启线程售票thread1.start();thread2.start();thread3.start();}}


         这样的代码运行出来的结果是售出150张票,每张票分别卖给了三个不同的人,这就是线程安全问题的表现。


出现线程安全问题的根本原因

①有两个以上的线程共享资源,

②有多个语句操作了共享资源

解决方案

线程安全问题是通过线程同步机制解决的。

同步代码块格式如下:

synchronized(锁对象){        需要被同步的代码}

售票代码修改为:

class SaleTicket extends Thread{static int num=50;//票数Object o=new Object();public SaleTicket(String name){super(name);}@Overridepublic void run(){while(true){//同步代码块synchronized(o){if(num>0){System.out.println(Thread.currentThread().getName()+"售出了第"+num+"号票");num--;}else{System.out.println("售罄了!");break;}}}}}

同步代码块要注意事项

①锁对象可以是任意的一个对象

②在同步代码块中调用了sleep方法并不是释放锁对象

③只有真正存在线程安全问题的时候才使用同步代码块,否则会降低安全

④多线程操作的锁对象必须是唯一共享的

阅读全文
0 0