首页 > 编程语言 >JAVA并发

JAVA并发

时间:2023-03-20 15:44:25浏览次数:33  
标签:调用 JAVA 安全 并发 ThreadLocal 同步 线程

并发三要素:

可见性:一个线程对共享变量的修改,另一个线程能马上看到(CPU缓存引起)

原子性:一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。(CPU线程分时复用引起)

有序性:即程序执行的顺序按照代码的先后顺序执行

 

可见性:volatile

原子性:java中只有简单的读取、赋值(而且必须是将数字赋值给某个变量,变量之间的相互赋值不是原子操作)才是原子操作。

有序性:sychronized lock

 

happer-before原则:

单一线程原则

管程锁定规则

volatile变量规则

线程启动规则

线程加入规则

线程中断规则

对象终结规则

传递性

一个类在可以被多个线程安全调用时就是线程安全的,

不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。

 

不可变对象一定是线程安全的:final关键字修饰的基本数据类型;String;枚举类型;Number部分子类

绝对线程安全:调用者不需要额外的同步措施

相对线程安全:相对线程安全需要保证对这个对象单独的操作是线程安全的,在调用的时候不需要做额外的保障措施。但是对于一些特定顺序的连续调用,就可能需要在调用端使用额外的同步手段来保证调用的正确性(Vector、HashTable、Collections 的 synchronizedCollection() 方法包装的集合等。)

线程兼容

线程兼容是指对象本身并不是线程安全的,但是可以通过在调用端正确地使用同步手段来保证对象在并发环境中可以安全地使用,我们平常说一个类不是线程安全的,绝大多数时候指的是这一种情况。Java API 中大部分的类都是属于线程兼容的,如与前面的 Vector 和 HashTable 相对应的集合类 ArrayList 和 HashMap 等。

线程对立:通常有害

 

线程安全的实现方法:

互斥同步:synchronized 和 ReentrantLock。

非阻塞同步:CAS,AtomicInteger,ABA

无同步方案:栈封闭(虚拟机栈上的局部变量),线程本地存储(

ThreadLocal 从理论上讲并不是用来解决多线程并发问题的,因为根本不存在多线程竞争。

在一些场景 (尤其是使用线程池) 下,由于 ThreadLocal.ThreadLocalMap 的底层数据结构导致 ThreadLocal 有内存泄漏的情况,应该尽可能在每次使用 ThreadLocal 后手动调用 remove(),以避免出现 ThreadLocal 经典的内存泄漏甚至是造成自身业务混乱的风险。),可重入代码

 

  • 多线程的出现是要解决什么问题的?
  • 线程不安全是指什么? 举例说明
  • 并发出现线程不安全的本质什么? 可见性,原子性和有序性。
  • Java是怎么解决并发问题的? 3个关键字,JMM和8个Happens-Before
  • 线程安全是不是非真即假? 不是
  • 线程安全有哪些实现思路?
  • 如何理解并发和并行的区别?

JAVA中的锁:

乐观锁 悲观锁(宏观概念)

自旋锁 自适应自旋锁

无锁 偏向锁 轻量级锁 重量级锁

公平锁 非公平锁

可重入锁 非可重入锁

独享锁(排他锁) 共享锁

 

 

标签:调用,JAVA,安全,并发,ThreadLocal,同步,线程
From: https://www.cnblogs.com/WZXwzx/p/17234405.html

相关文章

  • java方法-定义及调用
    方法的定义及调用定义:Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法:方法包含一个方法头和一个方法体,下面是......
  • java网络编程
    初始网络编程常见浏览器的架构有些比较大型的软件这2种架构都会兼顾2种架构的优缺点比较B/S架构,以网页游戏为例画面烂C/S架构在c/s架构中,安装包中已经有......
  • java-线程之间的协作
      一、线程之间的协作:join()classJoinExample{privateclassAextendsThread{@Overridepublicvoidrun(){System.out.pri......
  • java 根据word xml模板生成word(个人v2版本)
    这里用的是poi相关jar包以及freemarker插值技术实现,poi相关jar包这里不再述说1,编辑word并保存为xml其中需要动态输出的内容使用${xxx}代替,xxx是你的java类属性值,如:年龄:${age......
  • Java线程知识点总结
    文章目录​​Java线程基础​​​​线程简介​​​​什么是进程​​​​什么是线程​​​​进程和线程的区别​​​​创建线程​​​​Thread​​​​Runnable​​​​Calla......
  • JUC 常用 4 大并发工具类 CountDownLatch、CyclicBarrier、Semaphore、ExChanger
    文章目录​​什么是JUC?​​​​4大常用并发工具类​​​​CountDownLatch​​​​CyclicBarrier​​​​Semaphore​​​​Exchanger​​什么是JUC?JUC就是java.util.concu......
  • Java开发 - 消息队列之Kafka初体验
    目录​​前言​​​​Kafka​​​​什么是Kafka​​​​Kafka软件结构​​​​Kafka的特点​​​​怎么启动Kafka​​​​下载Kafka​​​​配置Kafka ​​​​Zookeeper​......
  • JavaScript解析JSON
    一个对象以“{”开始,“}”结束。每个“key”后跟一“:”,“‘key/value’对”之间运用“,”分隔。遍历JSON对象中的数据,可通过for-in循环实现。数据{"主题":{......
  • JavaScript加密/解密与OpenAI的对接:生成加密对话的ChatGPT 4.0应用
    首先,我们来看一个简单的JavaScript加密算法的示例,该算法将输入的字符串每个字符的ASCII值加上1,并返回一个新的字符串。以下是加密函数的代码:javascriptCopycodefunctionen......
  • java-线程互斥同步
    写在前边,/***线程互斥同步:通过两种锁机制来控制多个线程对共享资源的互斥访问,synchronized、ReentrantLock*/一、JVM实现的synchronized。使用synchronized不用担心没......