前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【并发编程特性】并发编程特性之五种特性的探讨

【并发编程特性】并发编程特性之五种特性的探讨

作者头像
杨不易呀
发布2022-01-19 14:14:01
4700
发布2022-01-19 14:14:01
举报
文章被收录于专栏:杨不易呀

前言

编写正确的程序很难,而编写正确的并发程序则难上加难。与串行程序相比,在并发程序中存在更多容易出错的地方。那么,为何我们还要使用并发程序?线程是Java语言中不可或缺的重要功能,它们能使复杂的异步代码变得简单,从而极大地简化了复杂系统的开发。

JMM内存图:
image.png
image.png

一、共享性

  1. 数据共享性是线程安全的主要原因之一。
  2. 如果所有的数据只是在线程内有效,那就不存在线程安全性问题,3. 这也是我们在编程的时候经常不需要考虑线程安全的主要原因之一。
  3. 在多线程编程中,数据共享是不可避免的。
  4. 最典型的场景是数据库中的数据,为了保证数据的一致性,我们通常需要共享同一个数据库中数据

二、互斥性

  1. 资源互斥是指同时只允许一个访问者对其进行访问,具有唯一性和排它性。
  2. 我们通常允许多个线程同时对数据进行读操作,但同一时间内只允许一个线程对数据进行写操作。
  3. 所以我们通常将锁分为共享锁和排它锁,也叫做读锁和写锁。
  4. 如果资源不具有互斥性,即使是共享资源,我们也不需要担心线程安全。
  5. 对于不可变的数据共享,所有线程都只能对其进行读操作,所以不用考虑线程安全问题。
  6. 但是对共享数据的写操作,一般就需要保证互斥性

三、可见性

  1. 线程只能操作自己工作空间中的数据
  2. 每个工作线程都有自己的工作内存,所以当某个线程修改完某个变量之后,在其他的线程中,未必能观察到该变量已经被修改。
  3. 如何保证可见性? 一、 使用 volatile 关键字 1、 volatile关键字要求被修改之后的变量要求立即更新到主内存,每次使用前从主内存处进行读取。 2、当修饰引用类型的时候, 只能保证引用本身的可见性, 不能保证内部字段的可见性 二、 使用 synchronized加锁 1、synchronization它会保证unlock之前必须先将变量重新刷入主内存当中。

从而达到多个线程确保从主内存当中拿到的数据一致

四、原子性

一、 原子性就是指对数据的操作是一个独立的、不可分割的整体。换句话说,就是一次操作,是一个连续不可中断的过程,数据不会执行的一半的时候被其他线程所修改。

二、 示例

  1. X = 5 是一个写操作 具有原子性
  2. Y = X 不具有原子性 先把数据X读取工作空间 再把X值写给Y 是一个读写操作, 不具有原子性
  3. i++ 不具有原子性 读i到工作空间 +1后写到给i 刷新结果到内存
  4. a = a + 1 不具有原子性 读a到工作空间 +1 刷新结果到内存

三、如何保证原子性 1. Synchronized 2. JUC Lock加锁

被synchronized关键字或其他锁包裹起来的操作也可以认为是原子的。从一个线程观察另外一个线程的时候,看到的都是一个个原子性的操作

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 一、共享性
      • 二、互斥性
        • 三、可见性
          • 四、原子性
          相关产品与服务
          数据库
          云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档