synchronized关键字

同步监视器用来解决多线程发生数据错乱的问题
在一个线程操作数据时,其他线程无法同时操作同一数据


同步监视器只能是对象
并且推荐使用共享资源的对象
可以是当前对象(this),也可以是其他对象


1、可以有两种方法,一种是同步代码块,即将多个线程需要访问的同一块代码用synchronized包围

这个代码模拟买票系统,synchronized包围的代码是多个买票窗口需要共同访问的代码,在一个用户购票时,其他用户无法访问代码,以此保证票数不会出现错误,这就是为什么平时购票时,看到有余票,但是已下单就没有的原因。


synchronized (this) {
       //同步代码 块
    if (ticket>0) {
        //有票
     try {
   
      Thread.sleep(300);  //模拟出票时间3秒
     } catch (InterruptedException e) {
   
      // TODO 自动生成的 catch 块
      e.printStackTrace();
     }
     System.out.println(Thread.currentThread().getName()+"正在卖第"
       +(ticket--)+"张票");
    }
   }
   //这个代码模拟买票系统,synchronized包围的代码是多个买票窗口需要共同访问的代码
2、第二种方法是,将同步代码块提出来,新建一个同步方法,而后直接调用即可。

/** * 同步方法 */
 private synchronized void saleTicket() {
   
 	 // TODO 自动生成的方法存根
  	if (ticket>0) {
   
  	 	try {
   
   		 Thread.sleep(3000);
   		} catch (InterruptedException e) {
   
   	 	// TODO 自动生成的 catch 块
   	 	e.printStackTrace();
   		}
   		System.out.println(Thread.currentThread().getName()+"正在卖第"
   	  +(ticket--)+"张票");
 	 }
 }