Java多线程-同步代码块synchronized

解决思路:

就是将多条操作共享数据的线程代码封装起来,当有线程在执行这些代码的时候,其他线程是不可以参与运算的。

必须要当前线程把这些代码都执行完毕后,其他线程才可以参与运算。

在java中用同步代码块就可以解决这个问题。

同步代码块的格式:

synchronized(对象)

{

      需要同步的代码;

}

 

同步的好处:解决了线程的安全问题。

同步的弊端:多个线程需要判断锁,较为消耗资源。

 

同步的前提:必须是多个线程使用同一把锁。

 

释放锁

*如果一个线程一直占用一个对象的锁,则其他的线程将永远无法访问该对象,因此,需要在适当的时候,将对象锁归还。

*当线程执行到synchronized()块结束时,释放对象锁

*当在synchronized()块中遇到break, return或抛出exception,则自动释放对象锁。

*当一个线程调用wait()方法时,它放弃拥有的对象锁并进入等待队列。

 

TicketDemo_Runnable.java

 

class Ticket implements Runnable {

   private int num = 1000;
   String name;

   public void run() {
      sale();
   }

   private void sale() {
      synchronized (Ticket.class) {
        while (num > 0) {
           System.out.println(Thread.currentThread().getName() + ":票号"+ (num--));
        }
      }
   }
}

class TicketDemo_Runnable {
   public static void main(String[] args) {
      Ticket t = new Ticket();
      Thread t1 = new Thread(t, "窗口1");
      Thread t2 = new Thread(t, "窗口2");
      Thread t3 = new Thread(t, "窗口3");
      Thread t4 = new Thread(t, "窗口4");
      t1.start();
      t2.start();
      t3.start();
      t4.start();
   }
}