java 线程安全

java 线程安全


####本程序以简单但买票为例
####创建线程之后虽然可以方便一些操作,但是也有一些问题。(献上代码) ``` class Ticket implements Runnable { private int tick = 100;
    public void run()
    {
        try{//此处的线程睡眠仅仅是为了使实验结果更明显
            Thread.sleep(10);
        }catch(Exception e)//在这里简单的写一下,主要是提示线程切换的问题
        {
        }
        System.out.println(currentThread.getName()+"....sale:"+tick--);  
    }
}

class ThreadDemo
{
    public static void main(String[] args)
    {
        Ticket t = new Ticket();//创建一个Ticket对象

        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        Thread t3 = new Thread(t);
        Thread t4 = new Thread(t);

        t1.start();//将各各线程t1,t2,t3,t4线程启动
        t2.start();
        t3.start();
        t4.start();
    }
}
<br/>
####线程虽然实现了启动,但是在买票的过程中会出现一些异常的现象。(如下图)
<br/>![](http://images2015.cnblogs.com/blog/1017814/201705/1017814-20170503151351742-662630945.png)
<br/>
####在卖票系统中是不会出现-2,-1,0等问题的,但是由于多线程的原因造成有负数的出现,从而造成票的标号有负数
<br/>
####如何解决上述的问题呢
class Ticket implements Runnable
{
    private int tick = 100;
    
    private Object obj = new Object();
    public void run()
    {
        try{
            Thread.sleep(10);
        }catch(Exception e)//在这里简单的写一下,主要是提示线程切换的问题
        {
        }
        synchronized(obj)
        {
            if(tick >0)
            {
                 System.out.println(currentThread.getName()+"....sale:"+tick--);  

             }

        }
    }
}
<br/>
####使用synchronized(Object obj)使用该方法就可以实现线程同步的问题
<br/>![](http://images2015.cnblogs.com/blog/1017814/201705/1017814-20170503153552257-1001875104.png)
原文地址:https://www.cnblogs.com/gxcstyle/p/6802045.html