线程安全问题产生的原因: 1,多个线程在操作共享的数据。 2,操作共享数据的线程代码有多条。 当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算。就会导致线程安全问题的产生。
解决思路; 就是将多条操作共享数据的线程代码封装起来,当有线程在执行这些代码的时候,其他线程时不可以参与运算的。 必须要当前线程把这些代码都执行完毕后,其他线程才可以参与运算。 在java中,用同步代码块就可以解决这个问题。
同步代码块的格式:
synchronized(对象){需要被同步的代码 ;}同步的好处:解决了线程的安全问题。 同步的弊端:相对降低了效率,因为同步外的线程的都会判断同步锁。 同步的前提:同步中必须有多个线程并使用同一个锁。
例1:多个窗口购买火车票实例:
package day04;public class JavaTest { public static void main(String[] args) { SaleTicket st=new SaleTicket(); Thread t1=new Thread(st,"一号窗口"); Thread t2=new Thread(st,"二号窗口"); Thread t3=new Thread(st,"三号窗口"); Thread t4=new Thread(st,"四号窗口"); t1.start(); t2.start(); t3.start(); t4.start(); }}class SaleTicket implements Runnable{//sale英 [seɪl] n.拍卖;卖,出卖; PRivate int tickets=100; @Override public void run() { while(tickets>0){ sale(); } } private synchronized void sale(){//synchronized 同步。 if(tickets>0){ System.out.println(Thread.currentThread().getName()+"卖出了第"+(100-tickets+1)+"张票"); tickets --; try{ Thread.sleep(500);//假设购票过程需要500毫秒。 }catch(InterruptedException e){ e.printStackTrace(); } } }}运行结果:
一号窗口卖出了第1张票四号窗口卖出了第2张票二号窗口卖出了第3张票三号窗口卖出了第4张票三号窗口卖出了第5张票.................四号窗口卖出了第99张票四号窗口卖出了第100张票新闻热点
疑难解答