java 多线程 线程安全
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 多线程 线程安全相关的知识,希望对你有一定的参考价值。
import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * Created by meicai on 2017/3/17. */ public class Hello { public static void main(String [] args) { Ticket ticket=new Ticket(); Thread t1=new Thread(ticket); Thread t2=new Thread(ticket); t1.start(); t2.start(); } } class Ticket implements Runnable{ private int num=10; @Override public void run() { sale(); } public void sale(){ while(num>0){ try { Thread.sleep(10); System.out.println("卖第"+num+"张票"+Thread.currentThread().getName()); num--; } catch (InterruptedException e) { e.printStackTrace(); } } } }
如图第6张票被不同的线程卖了,这样就出问题了。
import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * Created by meicai on 2017/3/17. */ public class Hello { public static void main(String [] args) { Runnable r=new Ticket(); Thread t1=new Thread(r); Thread t2=new Thread(r); t1.start(); t2.start(); } } class Ticket implements Runnable{ Object obj=new Object(); private int num=500; @Override public void run() { sale(); } public void sale(){ //使用同步代码块来防止出现安全问题 synchronized (obj) { while (num > 0) { try { Thread.sleep(10); System.out.println("卖第" + num-- + "张票" + Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
同步代码块保证了线程安全,效率低下,(使用了加锁机制)
以上是关于java 多线程 线程安全的主要内容,如果未能解决你的问题,请参考以下文章