美文网首页
锁的几个易错点

锁的几个易错点

作者: 小船儿爱学习 | 来源:发表于2021-02-02 00:36 被阅读0次

1、禁止使用高层并发对象的内置锁

实现java.util.concurrent.locks包中的Lock或Condition接口的类,被认为是高层并发对象。使用这些对象的内置锁是有问题的。使用Lock对象的内置锁的代码很可能与使用Lock接口的代码交互,这样可能会被误认为它们使用同一个锁来保护数据,而实际上使用了两个不同的锁,这样使用将无法保护数据。

\\ 错误示例(ReentrantLock)
private final Lock lock = new ReentrantLock();

public void doSomething() {
      synchronized(lock) {
          // do something
      }
}

上述错误示例中,doSomething()方法中,基于ReentrantLock的内置锁实现同步而不是基于被ReentrantLock封装的可重入的互斥锁实现同步。

\\ 正确示例(lock()、unlock())
private final Lock lock = ReentrantLock();

public void doSomething() {
      lock.lock();
      try {
          // do something
      } finally {
          lock.unlock();
      }
}

2、不可以用实例锁来同步静态数据

\\ 示例
public class CountBoxes implements Runnable {
    private static volatile int counter;

    private final Object lock = new Object();

    @Override
    public void run() {
        synchronized (lock) {
            counter++;
        }
    }

    public static void main(String[] args) {
        for (int i = 0; 1 < 2; i++) {
            new Thread(new CountBoxes()).start();
        }
    }
}

3、禁止基于getClass()返回的类对象进行同步

基于Object.getClass()方法的返回值同步可能会导致不符合预期的行为。当类实现继承时,子类只能基于子类进行锁定。子类与基类的Class对象是完全不同的。
当声明一个类的方法为同步方法时,该方法会基于对应的Class对象实现同步。
使用getClass()的返回值作为锁对象时,可能会导致开发人员误认为子类会基于基类进行同步。所以在编码过程中,应该使用明确的锁对象。

注:Object getClass()方法用于获取对象的运行时对象的类。

import java.util.ArrayList;
 
class RunoobTest {
    public static void main(String[] args) { 
    // getClass() with Object
    Object obj1 = new Object();
    System.out.println("obj1 的类为: " + obj1.getClass());
 
    // getClass() with String
    String obj2 = new String();
    System.out.println("obj2 的类为: " + obj2.getClass());
 
    // getClass() with ArrayList
    ArrayList<Integer> obj3 = new ArrayList<>();
    System.out.println("obj3 的类为: " + obj3.getClass());
    }
}
// 以上程序执行结果为:
// obj1 的类为: class java.lang.Object
// obj2 的类为: class java.lang.String
// obj3 的类为: class java.util.ArrayList 

ArrayList<Integer>和ArrayList<String>返回的都是class java.util.ArrayList

4、死锁

下列哪种操作可能带来死锁? C
A: lock(m1) lock(m2) unlock(m1) unlock(m2)
B: lock(m1) lock(m2) unlock(m2) lock(m2) unlock(m1) unlock(m2)
C: lock(m1) lock(m2) unlock(m1) lock(m1) unlock(m2) unlock(m1)
D: lock(m1) lock(m2) unlock(m1) unlock(m2) lock(m1) unlock(m1)

解析:前提条件是两个或多个进程都是按照相同的顺序来上锁、解锁的。

相关文章

  • 锁的几个易错点

    1、禁止使用高层并发对象的内置锁 实现java.util.concurrent.locks包中的Lock或Cond...

  • 易错点

    rate_ave=1042.00/793 而非rate_ave=1042/793if rate>=rate_av...

  • 易错点

    泛型 泛型约束使用extends而非implements 泛型类型没有多态的说法,所以出现了?通配符 泛型方法必须...

  • 每天分享一个语法小知识系列-2

    几个托福常见搭配,易错点 1)Can not but do sth. 2)Can not help doing s...

  • 四级备考笔记

    易错点 NOT!!

  • BigDecimal的易错点

    divide 必须带四舍五入模式,用于解决若除不尽时,报四舍五入的异常 异常结果

  • 函件易错点

    能将思维导图更好的运用在工作上,不仅能让自己的思路变的清晰,也让增加了我对工作的兴趣和热情!希望自己会有更大的改变!

  • golang易错点

    sdfsdsdfs

  • Leetcode 易错点

    1.索引变量自加的时候要注意与上下文之间的关系,要保证此变量不会再被调用,才可以自加。

  • React 易错点

    1. css的模块化 2. setState合并 3. 新的生命周期函数(16.3) 参考: https://ju...

网友评论

      本文标题:锁的几个易错点

      本文链接:https://www.haomeiwen.com/subject/kbdetltx.html