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)