美文网首页
03 互斥锁

03 互斥锁

作者: hopi | 来源:发表于2021-08-02 08:04 被阅读0次

synchronized 关键字

修饰静态方法:定的是当前类的 Class 对象

class Clz {
  // 修饰静态方法
  synchronized static void m() {}
  // 上面相当于
  synchronized(X.class) static void m() {}
}  

修饰非静态方法:锁定的是当前实例对象 this

class Clz {
  // 修饰静态方法
  synchronized void m() {}
  // 上面相当于
  synchronized(this) void m() {}
}  

修饰代码块:锁定指定对象

class Clz {
  // 修饰代码块
  Object obj = new Object();
  void m() {
    // 锁定 obj 对象
    synchronized(obj) {
        // 代码块
    }
  }
}  

思考题 1

class Test {
  long value = 0L;
  // get 方法的 synchronized 关键字是必须的吗? 
  synchronized long get() {
    return value;
  }
  synchronized void add() {
    value += 1;
  }
} 

如 get 方法不加 synchronized 关键字,就意味着 get 方法没受管程约束。不能保证访问 value 变量的可见性。所以不是线程安全的。所以synchronized 关键字是必须的。

get 方法需要加锁保护

思考题 2

// 通过下面源码画出锁的对应关系
class Test {
  static long value = 0L;
  synchronized long get() {
    return value;
  }
  synchronized static void add() {
    value += 1;
  }
}

get 方法和 add 方法分别加了不同的所,所以源码为非线程安全。

锁对应关系

注意事项

  1. 理清资源与锁的关系。
  2. 解决原子性问题,要保证中间状态对外不可见。
  3. 不能使用可变对象做锁。

相关文章

  • 03 互斥锁

    synchronized 关键字 修饰静态方法:定的是当前类的 Class 对象 修饰非静态方法:锁定的是当前实例...

  • 线程同步与互斥

    Linux--线程编程 多线程编程-互斥锁 线程同步与互斥 互斥锁 信号量 条件变量 互斥锁 互斥锁的基本使用...

  • Golang 锁的相关知识

    Golang锁分类:互斥锁(Mutex)、读写锁(RWMutex)。 互斥锁 在编写代码中引入了对象互斥锁的概念,...

  • iOS底层探索-多线程锁

    多线程的锁大致可分为两大类:互斥锁、自旋锁;也可以分为三类:互斥锁、自旋锁、读写锁。 一、互斥锁:互斥+同步(强调...

  • 03|04 互斥锁

    上一篇主要讲了可见性和顺序性问题,互斥锁主要解决原子性问题。 锁模型中除了要知道临界区,还要明确锁要保护的资源 锁...

  • go-锁机制

    Golang中的锁机制主要包含互斥锁和读写锁 互斥锁 互斥锁是一种简单的加锁的方法来控制对共享资源的访问,互斥锁只...

  • 线程锁

    1.常见的锁包括:互斥锁,自旋锁。 2.互斥锁是指锁的类型,自旋锁是指锁的实现方式。 3.互斥锁:当上...

  • 算法:读写者问题

    锁解析 : RWMutex : 读-写互斥锁 WWMutex : 写-写互斥锁 WPriorityMutex =...

  • 可重入读写锁 ReentrantReadWriteLock

    读写锁分为读锁和写锁,多个线程获取读锁不互斥,读写锁、写写锁互斥。 输出

  • C++锁

    锁的种类 互斥锁、条件锁、自旋锁、读写锁、递归锁。 互斥锁 头文件: 类型:pthread_mutex_t, 函数...

网友评论

      本文标题:03 互斥锁

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