![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 /* 内容:同步代码块,目的是解决多线程中的安全问题。什么安全问题呢??就是在执行run方法时,假如线程-0刚刚获得执行权, 2 *还没执行时,就挂那了,这时线程-1获得执行权,并进行执行,就有可能出现负数票的情况。 3 *原因:当一个线程执行run方法时,线程1操作共享数据时,失去了cpu执行权,导致线程2执行run方法,从而导致共享数据错误。 4 * 解决办法:给多线程所要执行的代码加上锁。当一个线程执行run方法时,锁上锁,即使失去CPU执行权, 5 *从而使其他线程不能执行run方法; 6 * synchronized(对象_){同步代码}:同步代码块,其中包含多线程共同执行的代码,此代码被同步. 7 * 其中的对象就像一个锁.即使执行同步代码的线程失去CPU执行权,其他线程也会被锁在外面不能执行同步代码 8 * 疑惑:obj对象??/毕老师当时没讲,只说了可以是任意对象,他直接调用的object上帝类建立了对象; 9 * 例子:火车中的厕所10 * 同步前提:1,必须有两个或者两个以上的线程11 * 2,这些线程必须是使用的同一个锁.(原因举例:3,4节车厢的厕所,不是同一个锁,线程1,线程2可以同时进入3,4节车厢的厕所,不能达到同步的目的.12 *好出:解决了多线程的安全问题13 *弊端:每次都得判断锁,浪费了资源.14 */15 package ThreadDemoOne;16 class TicketDemo implements Runnable17 {18 int ticket=1000;19 Object obj =new Object();20 public void run()21 {22 while(true)23 {24 synchronized(obj)//obj就是一个锁,这里的synchronized就是同步代码块.括起来的就是线程需要一次性执行完的代码.25 {26 27 if(ticket>0)28 {29 System.out.println(Thread.currentThread()+"号售票员"+"这是第"+this .ticket+"张票");30 ticket--;31 } 32 } 33 34 }35 }36 }37 public class ThreadDemo6 38 {39 public static void main(String[] args )40 {41 TicketDemo t=new TicketDemo();42 Thread t1=new Thread(t);43 Thread t2=new Thread(t);44 t1.start();45 t2.start();46 47 }48 49 50 51 }52 /*运行结果摘取:53 54 Thread[Thread-1,5,main]号售票员这是第156张票55 Thread[Thread-1,5,main]号售票员这是第155张票56 Thread[Thread-1,5,main]号售票员这是第154张票57 Thread[Thread-0,5,main]号售票员这是第153张票58 Thread[Thread-0,5,main]号售票员这是第152张票59 60 */61 62