JavaWeb——synchronized详解

这篇具有很好参考价值的文章主要介绍了JavaWeb——synchronized详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、特性

1、互斥性

2、不可中断性

3、可重入性

二、使用

1、修饰普通方法

2、修饰静态方法

3、修饰代码块

三、锁机制


一、特性

1、互斥性

  • 当线程进入synchronized修饰的代码块时,就相当于加锁。
  • 当线程退出synchronized修饰的代码块时,就相当于解锁。

在同一时刻只允许一个线程持有某个对象的锁,此时只有一个线程使用该代码块。通过这种特性实现了多线程的协调机制。因此互斥性也成为了操作的原子性。

当已经有线程获取到该对象的锁时,其他线程也执行到该对象的被synchronized所修饰的方法也想获取锁进行加锁操作。但由于互斥性无法获取该锁,此时其他线程就会进入阻塞等待状态,直到之前的线程解锁后,其他线程才有机会获得该锁。

注:synchronized是非公平锁,并不会遵守先来后到的规则,而是同时竞争。是否能获得锁还得看操作系统的调度

2、不可中断性

当线程执行到的对象的锁被其他线程获得后,如果当前线程还想获得该锁,就只能进行阻塞等待,直到已获得该锁的线程释放锁后再尝试去获得锁。

3、可重入性

当一个线程请求另一个线程持有的锁时,请求的线程会阻塞,这是synchronized的不可中断性。但当线程去获取自己所拥有的锁时会请求成功而不会阻塞,这就是锁的可重入性

重入的原理:每个锁关联一个计数器和持有者线程,当计数器为0时候,这个锁被认为是没有被任何线程持有。

  • 当有线程持有锁时计数器进行自增并且记下锁的持有线程,当同一线程继续获取锁时计数器继续自增。
  • 当线程退出代码块时相应地计数器减1,直到计数器为0时锁被释放。此时该锁才能被其他线程获得。

同一线程的外层方法获得锁之后,内层方法可以直接获取改锁,可以避免内外层死锁(如下图)。


Object locker=new Object();
 
synchronized(locker){
    synchronized(locker){
 
    }
}

synchronized是可重入锁,可以防止出现死锁

当线程进入了外层的 synchronized 方法时会拿到该锁,加上锁后将会执行代码。而内部又有一个 synchronized修饰的方法,此时也需要获取到同一把锁。想要获取之前的锁就必须要让外层的方法执行完后释放锁,但外层 synchronized 包裹的代码执行完则需要内部的代码先执行完才行。因此该方法无法继续执行,产生了死锁。

此时synchronized 是可重入锁就很好的解决了死锁的问题。

二、使用

1、修饰普通方法

使用synchronized修饰普通方法时,其作用域是整个方法,锁住的对象仅仅是当前对象。

synchronized void func1(){

}

2、修饰静态方法

使用synchronized修饰静态方法时,其作用域时整个静态方法,因为静态方法属于类而不是对象,因此锁住的对象时当前类对象。

synchronized static void func2() {
        
}

3、修饰代码块

使用synchronized修饰代码块时,其作用域是整个代码块,作用对象是括号中的对象,这个作用对象可以是指定的对象,也可以是类。

Object locker=new Object();

synchronized (locker) {

}
  • 在 Java 中,任何一个继承自 Object 类的对象,都可以作为锁对象。加锁操作实际上是在操作 Object 对象头中的一个标识位。
  • 如果括号中的是this,说明锁的对象就是当前对象。
  • 如果括号中的是 xxx.class,说明锁的对象就是类对象。

三、锁机制

synchronized:文章来源地址https://www.toymoban.com/news/detail-415514.html

  • 既是乐观锁,也是悲观锁。
  • 既是轻量级锁,也是重量级锁。
  • 轻量级锁基于自旋实现,重量级锁基于挂起等待实现。
  • 不是读写锁。
  • 是可重入锁。
  • 是非公平锁。

到了这里,关于JavaWeb——synchronized详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • synchronized 详解

    synchronized是一个对象锁,这个是前提 要使得synchronized 生效,一定是两者用的是同一把锁,这个时候,才会有限制作用。 注意区分:锁定的是类对象,还是类的实例。 synchronized加在静态方法上锁定的是类对象,类对象在JVM中只有一个。 而加在普通方法上,锁定的是this指代的

    2024年02月01日
    浏览(22)
  • synchronize锁详解

    目录 1、什么是synchronize? 2、为什么要用synchronize锁? 2.1 代码演示 2.2 原因分析 2.3 专有名词解释 2.3.1 临界资源 2.3.2 临界区 2.3.3 竞态条件 3、synchronize锁的原理 3.1 锁升级过程 3.1.1 偏向锁 3.1.2 轻量级锁 3.1.3 重量级锁 3.1.4 总体过程 3.2 锁优化 3.2.1 自旋锁 3.2.2 锁粗化 3.2.3 锁消

    2024年02月02日
    浏览(26)
  • 并发-synchronized详解

    JDK1.6之前的synchronized一来就直接给对象加了一把重量级锁,频繁地在用户态和内核态之间切换,导致性能非常低。为了弥补synchronized的不足,大佬doug lee写了一个AQS框架,用Java语言实现了ReentrantLock。然后在JDK1.6之后,oracle优化了synchronized的锁过程,增加了锁的膨胀逻辑

    2024年02月12日
    浏览(25)
  • java并发:synchronized锁详解

            在java多线程当中,我们总有遇到过多个线程操作一个共享数据时,而这个最后的代码执行结果并没有按照我们的预期一样得到正确的结果。此时我们就需要让代码执行在操作共享变量时,要等一个线程操作完毕时,另一个线程才能去操作这个共享变量。synchroniz

    2024年02月12日
    浏览(29)
  • pthead 互斥锁使用详解

    互斥锁:一种简单的线程同步机制,它可以用来保护共享资源,防止多个线程同时修改共享资源而引发竞争条件。 函数原型: mutex:指向要初始化的互斥锁的指针。 attr:一个可选的指向互斥锁属性的指针,用于设置互斥锁的属性,可以为 NULL。 返回值:成功返回 0,失败返

    2024年02月08日
    浏览(23)
  • 【Linux从入门到精通】线程互斥与互斥锁的使用与原理详解

      上篇文章我们对线程 | 线程介绍线程控制介绍后,本篇文章将会对多线程中的线程互斥与互斥锁的概念进行详解。同时结合实际例子解释了可重入与不被重入函数、临界资源与临界区和原子性的概念。希望本篇文章会对你有所帮助。 文章目录 引入 一、重入与临界 1、1 可重

    2024年02月07日
    浏览(32)
  • Java 关键字:synchronized详解

    Java中的synchronized用于在多线程环境下确保数据同步。它可以用来修饰方法和代码块 当一个线程访问一个对象的synchronized方法或代码块时,其他线程将无法访问该对象的其他synchronized方法或代码块。这样可以确保在同一时间只有一个线程能够执行该代码块或方法,避免

    2024年02月08日
    浏览(40)
  • Java多线程(二)——synchronized 详解

    目录 1 volatile 1.1保证变量可见性 1.2 不能保证数据的原子性举例 1.3 禁止JVM指令重排序 2 synchronized 2.1 概念及演进 2.2 对象锁和类锁 2.3 synchronized 的用法分类 2.4 synchronized 的用法详解 2.5 synchronized总结+补充 3 synchronized 底层原理 3.1 synchronized 同步语句块的情况

    2024年02月13日
    浏览(30)
  • C++11互斥量mutex使用详解

    mutex又称互斥量,C++ 11中与 mutex相关的类(包括锁类型)和函数都声明在#include头文件中,所以如果你需要使用 std::mutex,就必须包含#include头文件。 C++11提供如下4种语义的互斥量(mutex) : std::mutex,独占的互斥量,不能递归使用。 std::time_mutex,带超时的独占互斥量,不能递

    2024年02月16日
    浏览(29)
  • 【Java 并发编程】一文详解 Java 内置锁 synchronized

    存在共享数据; 多线程共同操作共享数。 synchronized 可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,同时 synchronized 可以保证一个线程的变化可见(可见性),即可以代替 volatile。 多线程编程中,有可能会出现多个线程同时访问同一个共享、可变

    2024年02月02日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包