Java语言程序设计——篇十七(3)


       🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿

  • 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳🌳
    您的点赞👍、关注➕、收藏⭐️、评论📝、私信📧是我最大的支持与鼓舞!!!🌻🌻🌻

并发编程基础

线程同步与对象锁

  • 多线程的并发执行 可以提高程序的效率,但是,当多个线程同时去访问同一个资源时,这可能引起线程冲突的情况。
  • 计数器Counter类对象,它作为共享数据资源。
  • 当两个操作运行在不同线程中,对同一个数据的两个操作就可能产生冲突。其原因是有些操作看起来是简单操作,但不是原子的, (原子操作:执行过程中,不能被线程调度器中断的操作)虚拟机需要用多个步骤完成。
  • 如表达式:count++;
    1)检索count的当前值。
    2)为检索到的值加1。
    3)增加1后的值存到count中。
  • 对于Counter对象,两个线程A和B。线程A调用increment()方法,同时线程B也调用increment()方法。如果count的初值为0,它们交错的动作可能按下列顺序执行。
    1)线程A:检索count的值0。
    2)线程B:检索count的值0。
    3)线程A:将count加1,count的结果为1。
    4)线程B:将count加1,count的结果为1。
    5)线程A:将结果存回count,count的值为1。
    6)线程B:将结果存回count,count的值为1。
  • 要防止多个线程同时访问同一资源产生冲突,就是防止多个线程同时执行共享对象的方法代码。程序中这样的代码称作临界区(critical section)。
  • 为保证临界区中的代码在一段时间内只被一个线程执行,应在线程开始执行临界区代码时,给临界区加锁, 这样,其他线程在这个临界区被解锁之前,无法执行临界区的代码,在其被解锁之后,其他线程才可以锁定并执行其中的代码。
  • Java的每个对象都有一个内在锁(intrinsic lock),有时也称作监视器锁(monitor lock)。
  • 获得对象的内在锁是能够独占该对象访问权的一种方式。获得对象的内在锁 与锁定对象是一样的。
  • Java通过同步代码块实现内在锁,Java支持两种同步:
    1)方法同步
    2)块同步

线程同步与对象锁---方法同步

  • 方法同步就是在定义方法时使用synchronized关键字修饰,被修饰的方法为同步方法,具体语法格式如下:
  • 被synchronized修饰的方法在某一时刻只允许一个线程访问,访问该方法的其他线程都会发生阻塞,直到当前线程访问完毕后,其他线程才有机会执行该方法。

线程同步与对象锁---块同步

  • 如果使用类库中的类或别人定义的类时,调用的方法没有使用synchronized关键字修饰,又要获得对象锁,可以使用下面的格式:
  • lock是一个锁对象,它是同步代码块的关键。当某一个线程执行同步代码块时,其它线程将无法执行当前同步代码块,会发生阻塞,等当前线程执行完同步代码块后,其它的线程开始抢夺执行权,抢到执行权的线程将进入同步代码块,执行其中的代码。循环往复,直到共享资源被处理完为止。
  • 这个过程就好比一个公用电话亭,只有前一个人打完电话出来后,后面的人才可以打。
  • 下面代码利用非线程安全的Counter类作为计数器,为了在计数器递增的时候将计数器对象锁定,incrementCount()方法锁定Counter对象。
java 复制代码
    Counter counter = new Counter();
    public void incrementCount(){
          synchronized (counter){  // 锁定counter对象
	      // 执行需要同步的语句
                 counter.increment();
         }
    }

线程同步与对象锁---类锁

  • 每个类也可以有类锁。类锁控制对类的synchronized static代码的访问。请看下面的例子。
java 复制代码
    public class SampleClass{
         static int x, y;
         static synchronized void increment(){
            x++;  
            y++;
        }
    }

博主用心写,读者点关注,互动传真情,知识不迷路。

相关推荐
小番茄程序猿43 分钟前
Redis 编码压测 59 轮:HSET 快 23 倍是假象,SMEMBERS 慢 30 倍是真的
redis·后端
BaiPeter1 小时前
ZPL文件预览
开发语言·c++
aiks_yuan1 小时前
Java CPU 100% 怎么排查:JDK 11 起 jstack 自带线程 CPU 时间,不用再 top -H 换算十六进制(JDK 8、11、17 实测)
java
鶴哥只手遮天2 小时前
《Redis 8.10.3 深度剖析》系列 ·第 13 章 Set:三种编码、集合运算与随机采样
redis·后端·开源
Flynn Liang3 小时前
AiServices 源码级拆解:一个接口如何变成 RAG Agent
java·langchain·源码分析·rag·langchain4j·aiservices
Flynn Liang3 小时前
LangChain4j 1.23 架构全景:Java 大模型应用的 6 层抽象
java·langchain·大模型·rag·ai agent·langchain4j
聪明的笨猪猪4 小时前
实际工程问题:AI生成Redis分布式锁的原子性缺陷导致库存超卖
java·经验分享·面试·ai编程
软件技术NINI4 小时前
基于SpringBoot和Vue的新能源汽车销售推荐系统
java·vue.js·spring boot·后端·汽车·毕业设计·毕设
独隅4 小时前
WebStorm Linux 版安装实战与核心效能展示
linux·ide·webstorm
瑞克-桑切斯5 小时前
redis
数据库·redis·缓存