
java多线程
文章平均质量分 79
wx: fulltilt8
这个作者很懒,什么都没留下…
展开
-
线程锁synchronized (this)锁住的是对象还是方法
测试类:package com.koow.kkwwo.test;public class MyRunnable extends Thread { public static void main(String[] args) { Thread ta = new MyRunnable(); Thread tb = new MyRunnable(); ta.start(); tb.start(); } public void run() { F原创 2021-09-15 09:23:39 · 557 阅读 · 0 评论 -
小姐姐都能看懂的Happens-before规则,你还愣住了?
前言众所周知的并发编程三大特性;原子性、可见性、有序性;但是这些特性的起源你知道吗?可见性:正是由于CPU存在缓存,导致了变量修改的不可见性;原子性:线程切换是基于CPU指令而不是高级语言中的一行代码,线程切换可以发生在任意一条CPU指令执行之前,完成之后,因此只能保证CPU指令的原子性;有序性:最诡异的特性,一行代码被拆分成多个CPU指令,但是为了保持高性能,编译器对其做了排序,可能导致顺序改变。好了,以上的三大特性已经了解了,但是如何解决这些问题呢?正题来了,Java...转载 2021-07-22 11:28:24 · 70 阅读 · 0 评论 -
volatile变量能确保线程安全性吗?为什么?
1. volatile是什么? 在谈及线程安全时,常会说到一个变量——volatile。在《Java并发编程实战》一书中是这么定义volatile的——“Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程”。这句话说明了两点:①volatile变量是一种同步机制;②volatile能够确保可见性。这两点和我们探讨“volatile变量是否能够保证线程安全性”息息相关。volatile变量能确保线程安全性吗?为什么? 什么是同步机制?在并..转载 2021-07-22 09:46:01 · 5536 阅读 · 0 评论 -
从多线程的三个特性理解多线程开发
工作中许多地方需要涉及到多线程的设计与开发,java多线程开发当中我们为了线程安全所做的任何操作其实都是围绕多线程的三个特性:原子性、可见性、有序性展开的。针对这三个特性的资料网上已经很多了,在这里我希望在站在便于理解的角度,用相对直观的方式阐述这三大特性,以及为什么要实现和满足三大特性。一、原子性原子性是指一个操作或者一系列操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。其实这句话就是在告诉你,如果有多个线程执行相同一段代码时,而你又能够预见到这多个线程相互之间...原创 2021-07-21 16:39:54 · 70 阅读 · 0 评论 -
Happens-Before原则
上面讨论了Java中多线程共享变量的可见性问题及产生这种问题的原因。下面我们看一下如何解决这个问题,即当一个多线程共享变量被某个线程修改后,如何让这个修改被需要读取这个变量的线程感知到。为了方便程序员开发,将底层的烦琐细节屏蔽掉,JMM定义了Happens-Before原则。只要我们理解了Happens-Before原则,无需了解JVM底层的内存操作,就可以解决在并发编程中遇到的变量可见性问题。JVM定义的Happens-Before原则是一组偏序关系:对于两个操作A和B,这两个操作可以在不同的线程..原创 2021-07-21 02:27:01 · 488 阅读 · 1 评论 -
单核CPU仍然存在线程安全问题
Java内存模型是什么? 引用大师的一句话:“The Java Memory Model describes what behaviors are legal in multithreaded code, and how threads may interact through memory.” 翻译过来就是:Java内存模型描述了在多线程代码中哪些行为是合法的,以及线程如何通过内存进行交互。所以其他涉及到多线程的编程语言都会涉及到内存模型,如C/C++...转载 2021-07-20 11:05:04 · 1462 阅读 · 0 评论 -
从Java多线程可见性谈Happens-Before原则
从Java多线程可见性谈Happens-Before原则Happens-Before是一个非常抽象的概念,然而它又是学习Java并发编程不可跨域的部分。本文会先阐述Happens-Before在并发编程中解决的问题——多线程可见性,然后再详细讲解Happens-Before原则本身。Java多线程可见性在现代操作系统上编写并发程序时,除了要注意线程安全性(多个线程互斥访问临界资源)以外,还要注意多线程对共享变量的可见性,而后者往往容易被人忽略。可见性是指当一个线程修改了共享变量的值,其原创 2021-07-08 01:57:36 · 147 阅读 · 2 评论 -
Java 并发编程:核心理论
Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁、偏向锁) Java 并发编程:线程间的协作(wait/notify/sleep/yield/join) Java 并发编程:volatile的使用及其原理 并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能。它要求编程者对计算机最底层的运作原理有深刻的理解,同时要...原创 2021-06-06 15:15:03 · 88 阅读 · 0 评论 -
MySQL索引-B+树原理分析
索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据。索引最形象的比喻就是图书的目录了。注意这里的大量,数据量大了索引才显得有意义,如果我想要在 [1,2,3,4] 中找到 4 这个数据,直接对全数据检索也很快,没有必要费力气建索引再去查找。索引在 MySQL 数据库中分三类:B+ 树索引 Hash 索引 全文索引我们今天要介绍的是工作开发中最常接触到的 InnoDB 存储引擎中的 B+ 树索引。要介绍 B+ 树索引,就不得不提二叉查找树,平衡二叉树和 B 树这三种...原创 2021-05-24 15:27:46 · 138 阅读 · 0 评论 -
图示B树和B+树的原理和操作过程
1 B树在介绍B+树之前, 先简单的介绍一下B树,这两种数据结构既有相似之处,也有他们的区别,最后,我们也会对比一下这两种数据结构的区别。1.1 B树概念B树也称B-树,它是一颗多路平衡查找树。二叉树我想大家都不陌生,其实,B树和后面讲到的B+树也是从最简单的二叉树变换而来的,并没有什么神秘的地方,下面我们来看看B树的定义。 每个节点最多有m-1个关键字(可以存有的键值对)。 根节点最少可以只有1个关键字。 非根节点至少有m/2个关键字。 每个节点中的关...原创 2021-05-23 16:29:47 · 1997 阅读 · 0 评论 -
分布式应⽤知识CAP理论知识
讲解分布式核⼼知识CAP理论CAP定理: 指的是在⼀个分布式系统中,Consistency(⼀致性)、 Availability(可⽤性)、 Partition tolerance(分区容错性),三者不可同时获得。 ⼀致性(C):在分布式系统中的所有数据备份,在同⼀时刻是否同样的值。(所有节点在同⼀时间 的数据完全⼀致,越多节点,数据同步越耗时) 可⽤性(A):负载过⼤后,集群整体是否还能响应客户端的读写请求。(服务⼀直可⽤,⽽且是正 常响应时间) 分区容错性(P):分区..原创 2021-02-23 15:24:42 · 76 阅读 · 0 评论 -
ThreadLocal原理和使用场景
ThreadLocal与线程成员变量还有区别,ThreadLocal该类提供了线程局部变量。这个局部变量与一般的成员变量不一样,ThreadLocal的变量在被多个线程使用时候,每个线程只能拿到该变量的一个副本,这是Java API中的描述,通过阅读API源码,发现并非副本,副本什么概念?克隆品? 或者是别的样子,太模糊。准确的说,应该是ThreadLocal类型的变量内部的...原创 2020-01-06 11:28:05 · 167 阅读 · 0 评论 -
比较jdk7,jdk1.8下的ConcurrentHashMap源码分析
1、ConcurrentHashMap跟HashMap,HashTable的对比2、ConcurrentHashMap原理概览3、ConcurrentHashMap几个重要概念4、ConcurrentHashMap几个重要方法5、ConcurrentHashMap的初始化6、ConcurrentHashMap的put操作详解7、ConcurrentHashMap的扩容...原创 2019-03-19 17:22:13 · 539 阅读 · 2 评论 -
java线程池获取 当前线程池活动的线程数(线程池数)
我们在使用线程池的时候,想知道当前线程池下创建了多少个线程,或者创建了多少个线程池数可以通过下面的例子了解到: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Thr...原创 2019-03-20 10:43:14 · 22737 阅读 · 0 评论 -
理解ThreadPoolExecutor源码(一)线程池的corePoolSize、maximumPoolSize和poolSize
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/aitangyong/article/details/38822505我们知道,受限于硬件、内存和性能,我们不可能无限制的创建任意数量的线程,因为每一台机器允许的最大线程是一个有界值。也就是说ThreadPoolExecutor管理的线程数量是有界的。线程池就是用这些有限个数的线程,...转载 2019-03-20 14:55:40 · 157 阅读 · 0 评论 -
原子操作类AtomicInteger详解
所属专栏:Java编程之路版权声明:如果您觉得此文对您有帮助,请关注我! https://blog.youkuaiyun.com/fanrenxiang/article/details/80623884为什么需要AtomicInteger原子操作类?对于Java中的运算操作,例如自增或自减,若没有进行额外的同步操作,在多线程环境下就是线程不安全的。num++解析为num=num+1,明显...转载 2019-03-20 16:28:53 · 129 阅读 · 0 评论 -
Volatile关键词深度剖析
1背景12Volatile:易变的12.1小结23Volatile:不可优化的33.1小结44Volatile:顺序性44.1happens-before64.2小结75Volatile:Java增强86V...原创 2019-05-17 02:50:07 · 119 阅读 · 0 评论 -
深入理解Docker容器和镜像
【编者的话】本文用图文并茂的方式介绍了容器、镜像的区别和Docker每个命令后面的技术细节,能够很好的帮助读者深入理解Docker。如果你想和我或者更多Docker专家交流,可以加我微信453465325这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(container)和镜像(image)之间的区别,并深入探讨容器和运行中的容器之间的区别。当我对Docker技术还...原创 2019-06-04 15:36:08 · 122 阅读 · 0 评论 -
centos7使用Docker的详细教程
一、Docker是什么? 产生背景:开发和运维之间因为环境不同和导致的矛盾(不同的操作系统、软件环境、应用配置等)DevOps 代码、系统、环境、配置等封装成镜像Image--->运维; 集群的环境下每台服务器都要配置相同的环境; 解决“在我的机器是哪个可以正常工作”的问题; Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个...原创 2019-06-04 16:59:40 · 9158 阅读 · 0 评论 -
Java线程池之---ForkJoinPool线程池的使用以及原理
所属专栏:YourBatman的乌托邦版权声明: https://blog.youkuaiyun.com/f641385712/article/details/83749798相关阅读【小家java】java5新特性(简述十大新特性) 重要一跃【小家java】java6新特性(简述十大新特性) 鸡肋升级【小家java】java7新特性(简述八大新特性) 不温不火【小家java】java8...转载 2019-07-10 09:40:53 · 1073 阅读 · 0 评论 -
volatile为什么不能保证原子性
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/xdzhouxin/article/details/81236356首先要了解的是,volatile可以保证可见性和顺序性,这些都很好理解,那么它为什么不能保证原子性呢?可见性可见性与Java的内存模型有关,模型采用缓存与主存的方式对变量进行操作,也就是说,每个线程都有自己的...转载 2019-03-19 17:03:15 · 81 阅读 · 0 评论