Java线程安全问题解决方案

线程安全问题产生的原因:
Java线程安全问题解决方案_第1张图片

public class Runableimpl implements Runnable {
    private int ticket=100;
    //设置线程任务,卖票
    @Override
    public void run() {
        //先判断票是否存在
        if(ticket>0)
        {
            //票存在,卖票
            while(true)
            {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if(ticket>0)
                {
                    System.out.println(Thread.currentThread().getName()+"--》正在卖第"+ticket+"张票");
                    ticket--;
                }
            }
        }
    }
}

public class demoTicket {
    public static void main(String[] args) {
        //创建Runnable 接口的实现类对象
        Runableimpl run=new Runableimpl();
        //创建Thread对象
        Thread ta=new Thread(run);
        Thread t1=new Thread(run);
        Thread t2=new Thread(run);
        ta.start();
        t1.start();
        t2.start();
    }
}

执行结果:
Thread-2--》正在卖第100张票
Thread-1--》正在卖第100张票
Thread-0--》正在卖第100张票
Thread-0--》正在卖第97张票
Thread-2--》正在卖第97张票
Thread-1--》正在卖第97张票

原理分析:
Java线程安全问题解决方案_第2张图片

同步代码块-解决线程安全问题

//创建一个锁对象
    Object obj=new Object();
    //设置线程任务,卖票
    @Override
    public void run() {
        //先判断票是否存在
            //票存在,卖票
            while(true)
            {
                synchronized (obj){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if(ticket>0)
                    {
                        System.out.println(Thread.currentThread().getName()+"--》正在卖第"+ticket+"张票");
                        ticket--;
                    }
                }
            }
    }

原理:
Java线程安全问题解决方案_第3张图片

同步方法:解决线程安全问题

  public synchronized  void payTicket()
    {
        while(true)
        {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if(ticket>0)
                {
                    System.out.println(Thread.currentThread().getName()+"--》正在卖第"+ticket+"张票");
                    ticket--;
                }
        }
    }

Lock

public void run() {
        //先判断票是否存在
            //票存在,卖票
        while(true)
        {
            l.lock();
            try {
                Thread.sleep(1000);
                if(ticket>0)
                {
                    System.out.println(Thread.currentThread().getName()+"--》正在卖第"+ticket+"张票");
                    ticket--;
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                l.unlock();
            }
        }
}

你可能感兴趣的:(Java精进,多线程,java)