IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java并发编程图册学习(五) 解决原子性问题,首先需要宏观理解 -> 正文阅读

[Java知识库]Java并发编程图册学习(五) 解决原子性问题,首先需要宏观理解

目录

一、前言

二、锁

三、总结


一、前言

原子性问题的源头就是线程切换,但在多核 CPU的大背景下,不允许线程切换是不可能的

互斥: 同一时刻只有一个线程执行

上面这句话的意思是: 对共享变量的修改是互斥的,也就是说线程 A 修改共享变量时其他线程不能修改,这就不存在操作被打断的问题了

二、锁

synchronized 的三种用法:

public class ThreeSync {
    private static final Object object = new Object();

    public synchronized void normalSyncMethod(){ 
        //临界区
        //对于普通同步方法,锁的是当前实例对象,通常指 this
    }

    public static synchronized void staticSyncMethod(){ 
        //临界区
        //对于静态同步方法,锁的是当前类的 Class 对象,如 ThreeSync.class
    }

    public void syncBlockMethod(){ 
        synchronized (object){
            //临界区
            //对于同步方法块,锁的是 synchronized 括号内的对象
        }       
    }
}
  1. 对于普通同步方法,锁的是当前实例对象,通常指 this
  2. 对于静态同步方法,锁的是当前类的 Class 对象,如 ThreeSync.class
  3. 对于同步方法块,锁的是 synchronized 括号内的对象

那什么是临界区呢??

临界区: 我们把需要互斥执行的代码看成为临界区

如何用锁保护有效的临界区才是关键

线程进入临界区之前,尝试加锁 lock(), 加锁成功,则进入临界区(对共享变量进行 修改),持有锁的线程执行完临界区代码后,执行 unlock(),释放锁。针对这个模 型,大家经常用抢占厕所坑位来形容

?

  1. 我们锁的是什么?
  2. 我们保护的又是什么?

?资源 R (共享变量) 就是我们要保护的资源,所以我们就要创建资源 R 的锁来保护资源 R

  1. 编写串行程序时,是不建议 try...catch 整个方法的,这样如果出现问是很难定位的,道理一样,我们要用锁精确的锁住我们要保护的资源就够了,其他无意义的资源是不要锁的

  2. 锁保护的东?越多,临界区就越大,一个线程从走入临界区到走出临界区的时间就越?,这就让其他线程等待的时间越久,这样并发的效率就有所下降,其实这是涉及到锁粒度的问题

public class ValidLock {
    private static final Object object = new Object(); 
    private int count;
    
    public synchronized void badSync(){ 
        //其他与共享变量count无关的业务逻辑 
        count++;
    }

    public void goodSync(){ 
        //其他与共享变量count无关的业务逻辑 
        synchronized (object){
            count++; 
        }
    } 
}
 
public class UnsafeCounter {
    private static int count;

    public synchronized void counter(){ 
        count++;
    }
    
    public static synchronized int calc(){ 
        return count++;
    } 
}

一个锁的是 this,一个锁的是 UnsafeCounter.class, 他们都想保护共享变量 count

两个临界区是用两个不同的锁来保护的,所以临界区没有互斥关系,也就不能保护 count,所以这样加锁是无意义的

三、总结

  1. 解决原子性问题,就是要互斥,就是要保证中间状态对外不可?
  2. 锁是解决原子性问题的关键,明确知道我们锁的是什么,要保护的资源是什么,更重要的要知道你的锁能否保护这个受保护的资源
  3. 有效的临界区是一个入口和一个出口,多个临界区保护一个资源,也就是一个资源有多个并行的入口和多个出口,这就没有起到互斥的保护作用,临界区形同虚设

  4. 锁自己家?能保护资源就没必要锁整个小区,如果锁了整个小区,这严重影响 其他业主的活动(锁粒度的问题)

?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-06 10:55:43  更:2022-05-06 10:56:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:36:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码