Java 线程同步 synchronized2013-12-07 csdn BruceZhang先来看一个不带线程同步的例子,这个例子很简单,只是让两个线程输出同样的内容,并不做其他的事, 所以,线程同步在这里体现的并不明显。
import java.util.Date; public class ThreadTest extends Thread{int pauseTime;String name; /*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubThreadTest tT1 = new ThreadTest(1000, "Thread1");tT1.start();ThreadTest tT2 = new ThreadTest(3000, "Thread2");tT2.start(); }public ThreadTest(int pauseTime , String name){this.pauseTime = pauseTime;this.name = name;} @Overridepublic void run() {// TODO Auto-generated method stubsuper.run();while(true){try {System.out.println(name + ":"+ new Date(System.currentTimeMillis()));Thread.sleep(pauseTime);} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}} }在来看一个多线程售票的问题,这个例子中体现线程同步的重要性 ,不保证这一点将会导致错误的执行结果
class TicketSouce implements Runnable{//票的总数private int ticket=10;public void run(){for(int i=1;i<50;i++){if(ticket>0){//休眠1s秒中,为了使效果更明显,否则可能出不了效果try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"号窗口卖出"+this.ticket--+"号票");}}}}public class Test {public static void main(String args[]){TicketSouce mt=new TicketSouce();//基于火车票创建三个窗口new Thread(mt,"1").start();new Thread(mt,"2").start();new Thread(mt,"3").start();}}输出结果如下图所示: