五、线程同步 Lock 锁

一、线程同步的第三种方法

Lock 锁:对需要上锁的地方上锁

1) JDK1.5 后新增的功能

2) 与 Synchronized 相比,Lock 可提供多种锁方案,更灵活

3) Java.util.concurrent.locks 中的 Lock 是一个接口,它的实现 类是一个 Java 类,而不是作为语言的特性(关键字)来实现

注意:如果同步代码有异常,要将 unLock()放到 finally 中

二、步骤

1) 创建 Lock 对象

2) 调用 lock()方法上锁

3) 调用 unlock()方法解锁

三、Lock 与 synchronized 的区别

1) Lock 是 显 示 锁 ( 手 动 开 启 和 关 闭 锁 , 别 忘 关 闭 锁),synchronized 是隐式锁

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

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

4) Lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它 将一直等待(即被阻止),直到该对象被释放。lock()方法会 对 Lock 实例对

象进行加锁,因此所有对该对象调用 lock() 方法的线程都会被阻塞,直到该 Lock 对象的 unlock()方法被调用、

 1 public class CountRunnable implements Runnable{
 2     public static void main(String[] args) {
 3         CountRunnable cr=new CountRunnable();
 4         //代理类的对象
 5         Thread t1=new Thread(cr,"A");
 6         Thread t2=new Thread(cr,"B");
 7         Thread t3=new Thread(cr,"C");
 8 
 9         t1.start();
10         t2.start();
11         t3.start();
12 
13     }
14     private int count=0;//默认值
15     //创建一个Lock对象
16     Lock lock = new ReentrantLock();
17     @Override
18     public  void run() {
19         for (int i = 0; i < 10; i++) {
20             //synchronized (this) {
21             try {
22                 lock.lock();//加锁
23                 count++;
24                 try {
25                     Thread.sleep(300);
26                 } catch (InterruptedException e) {
27                     // TODO Auto-generated catch block
28                     e.printStackTrace();
29                 }
30                 System.out.println(Thread.currentThread().getName() + "执行操作:count=" + count);
31             }finally {  //防止出现异常,不进行解锁
32                 //解锁
33                 lock.unlock();
34             }
35         }
36     }
37 }

原文地址:https://www.cnblogs.com/qiaoxin11/p/12720415.html