synchronized(){}同步代码块笔记(新手笔记,欢迎纠正)
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 Runnable 17 { 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