锁(Lock)


锁(lock)

package gaoji;

import java.util.concurrent.locks.ReentrantLock;

public class TestLock {

   public static void main(String[] args) {
       TestLock2 testLock2 = new TestLock2();

       new Thread(testLock2).start();
       new Thread(testLock2).start();
       new Thread(testLock2).start();
  }

}
class TestLock2 implements Runnable{
   int ticketNums = 10;

   //定义lock锁,ReentrantLock可重置锁
   private final ReentrantLock lock = new ReentrantLock();

   @Override
   public void run() {
       while (true){
           try {
               lock.lock();//加锁
               if (ticketNums > 0){
                   try {
                       Thread.sleep(1000);
                  } catch (InterruptedException e) {
                       e.printStackTrace();
                  }
                   System.out.println(ticketNums--);
              }else{
                   break;
              }
          }finally {
               lock.unlock();//解锁
          }
      }
  }
}

synchronized 与 Lock的对比

  • Lock是显示锁(手动开启和关闭锁,别忘记关闭锁)synchronized是隐式锁,出了作用域自动释放

  • Lock只有代码块锁,synchronized有代码块锁和方法锁

  • 使用Lock锁,JVM将花费较少的时间来调度线程,性能更好,并且具有更好的扩展性(提供更多的子类)

  • 优先使用顺序:

    Lock > 同步代码块(已经进入了方法体,分配了相应资源)>同步方法(在方法体之外)

  •  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM