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  
View Code
原文地址:https://www.cnblogs.com/ruoniao/p/5418589.html