Lock 同步锁

一、

         /*
          * 一、用于解决多线程安全问题的方式:
          * 
          * synchronized:隐式锁
          * 1. 同步代码块
          * 
          * 2. 同步方法
         * 
         * jdk 1.5 后:
         * 3. 同步锁 Lock
         * 注意:是一个显示锁,需要通过 lock() 方法上锁,必须通过 unlock() 方法进行释放锁
         */
           public class TestLock {

                        public static void main(String[] args) {
	                        Ticket ticket = new Ticket();
	
	                        new Thread(ticket, "1号窗口").start();
	                        new Thread(ticket, "2号窗口").start();
	                        new Thread(ticket, "3号窗口").start();
                        }

          }

        class Ticket implements Runnable{

                        private int tick = 100;

                        private Lock lock = new ReentrantLock();

                        @Override
                        public void run() {
	                while(true){
		
		                  lock.lock(); //上锁
		
		                  try{
			                  if(tick > 0){
				                try {
					            Thread.sleep(200);
				                } catch (InterruptedException e) {
				          }
				
				            System.out.println(Thread.currentThread().getName() + " 完成售票,余票为:" + --tick);
			                 }
		                }finally{
			            lock.unlock(); //无论执行结果如何,最后必须释放锁
		                }
	                  }
                  }

                    }

二、Lock的使用

      Lock lock = new ReentrantLock();
      lock.lock();
      try {
      } finally {
          lock.unlock();
      }


    
 注意 :

      A:在finally块中释放锁,目的是保证在获取到锁之后,最终能够被释放
      B: 不要将获取锁的过程写在try块中,因为如果在获取锁(自定义锁的实现)时发生了异常,异常抛出的同时,也会导致锁无故释放

三、重入锁

    重入锁ReentrantLock,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对 资源的重复加锁
posted @ 2020-11-29 03:12  jock_javaEE  阅读(84)  评论(0编辑  收藏  举报