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();
   }
}