自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(69)
  • 收藏
  • 关注

原创 Netty 学习笔记(八)、Netty 如何发送(接收)类对象

概述通过前几篇博客的介绍,我们知道 Netty 是一款高性能客户端、服务端框架,它底层通过 NIO 实现非阻塞传输流数据。前几篇测试 Demo 我们都是通过将字符串转字节数组的形式进行交互,然而实际应用场景中几乎很少用到字符串作为源数据,大部分数据结构都被封装为类对象的形式,本篇博客我就来简单介绍下 Netty 一般是如何发送和接收类对象信息的:Netty 如何发送(接收)类对象在正式开始介绍前,我们先了解序列化、反序列化的概念:序列化:Java 类对象转化为流数据的这个过程就叫序列化反序列化

2020-11-03 15:53:11 1107 1

原创 LeetCode 97.交错字符串(递归 + dp)

问题描述递归拿到这个问题的第一反应就是递归:假设 s1 的第一个字符和 s3 的第一个字符相等,那么问题就转化为去掉第一个字符的 s1 和完整的 s2 能否交错组成去掉第一个字符的 s3。以此类推,只要最终 s1,s2,s3 能完全匹配就返回 true,如果递归遍历所有情况都不存在解就返回 false。最后需要注意可以先通过长度判断去掉一些不可能返回 true 的情况。public boolean isInterleave(String s1, String s2, String s3) {

2020-10-28 13:31:01 252

原创 Netty 学习笔记(七)、Netty 如何解决 TCP 粘包/拆包问题(二)

概述上篇博客我简单介绍了粘包、拆包问题出现的原因以及 Netty 如何解决该问题,在博客最后我给出通过换行符分割数据包解决粘包问题的方案。然而在实际业务场景中,数据包可能不适用换行符分割这种方式,因为实际数据中可能包含换行符。本篇博客我就来简单补充两种更完整的解决方案:DelimiterBasedFrameDecoderDelimiterBasedFrameDecoder 类可以自定义分割符,一般在代码中这样使用:ByteBuf buf = Unpooled.copiedBuffer("$_".g

2020-10-28 10:28:01 247

原创 Netty 学习笔记(六)、Netty 如何解决 TCP 粘包/拆包问题

概述在早先博客我通过 NIO 实现时间服务器时曾提到:TCP 可能造成粘包/拆包问题,但由于之前的示例相对简单,因此没有做预防处理。本篇博客我就来简单聊一下 TCP 粘包/拆包 问题以及 Netty 如何解决该问题。什么是 TCP 粘包/拆包问题TCP 是一种流传输协议,所谓流传输就是指数据包之间没有界限,所有数据都是连在一起的。顶层应用层通过 TCP 发送数据时,TCP 并不了解该数据具体含义,它只会根据当前缓冲区的实际情况进行数据包的划分。这样就可能导致一个完整的业务数据包被拆分为多个TCP包发

2020-10-23 15:52:22 415

原创 Netty 学习笔记(五)、Netty 简单示例

概述前几篇博客我分别介绍了 Netty 出现的背景,Netty 的原理 NIO 以及 NIO 的增强版 AIO。有关学习 Netty 的前置基础知识都做了简单介绍,从本篇博客开始正式进入 Netty 框架的学习。本篇计划通过 Netty 实现时间服务器,在熟悉代码结构的基础上,挑出几个核心 API 做简单介绍,初步熟悉 Netty 如何使用。Netty 示例下面我们直接看代码,其中代码每一行的作用我通过注释的方式给出:Netty 服务端源码:public class TimeServer {

2020-10-22 14:48:18 328

原创 Netty 学习笔记(四)、Reactor 模式详解

概述前几篇博客我简单介绍了常见的几种 IO 模式,本篇博客我打算详细聊聊 Reactor 模式。其中 NIO 就可以抽象理解为 Reactor 模式的简易版,而且 Netty 很大一部分源码的编写也采用了 Reactor 模式。因此,学好 Reactor 模式可以简化日后学习 Netty 的难度。...

2020-10-19 16:04:40 287

原创 Netty 学习笔记(三)、AIO 简单介绍

概述上篇博客我简单介绍了 NIO 相关知识。JDK 1.7 版本对 NIO 库做了升级,实现了完全异步通信的新 IO 套接字以及通道,这种新 NIO 也被称为 AIO,本篇博客我就来简单介绍 AIO 相关知识。AIO 示例AIO 和 NIO 相比,最大的改进在于支持真正意义上的异步非阻塞。因为大部分实现和 NIO 相同,本篇我计划通过 AIO 实现时间服务器,并对关键 API 做简要说明。下面我们直接看代码,代码中每一行代码的功能我通过注释的方式给出:AIO 服务端:// aio 服务端启动类

2020-10-12 20:43:13 253 1

原创 Netty 学习笔记(二)、NIO 简单介绍

概述上篇博客我简单介绍了传统 socket 模型以及它的缺陷,在博客最后给出了 NIO 的模型。本篇博客我打算简单介绍 NIO 的基础知识以及如何使用。毕竟 NIO 是 Netty 的基础,如果对 NIO 完全不了解就去看 Netty 的话,很多概念不能抽象理解,学起来比较困难。...

2020-10-12 15:33:20 248

原创 TCP 完整总结

概述TCP/IP 是网络使用中最基本的通信协议,它规定了互联网中进行通信的标准和方法。其中它包含TCP、UDP、SMTP、IP 等绝大多数协议,因为 TCP、IP 协议最具代表,因此才命名为 TCP/IP 协议。本篇博客我就来简单整理 TCP 协议相关知识TCPTCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。本篇博客我打算分以下几个模块介绍 TCP 协议:TCP 协议的结构三次握手与四次挥手TCP 协议如何保证可靠性

2020-10-09 16:39:53 1073

原创 I/O 多路复用技术

概述在 I/O 编程过程中,当需要同时处理多个客户端请求时,可以利用多线程或 I/O 多路复用技术进行处理。本篇博客我就来简单介绍 I/O 多路复用相关知识。什么是 I/O 多路复用技术I/O 多路复用技术是指多个网络 I/O 复用一个或少量的线程来处理这些请求。其中它通过把多个 I/O 的阻塞复用到同一个 select 阻塞上,从而使系统在单线程的情况下可以同时处理多个客户端请求。下面我通过抽象示例简单描述 I/O 多路复用技术:假设你是一名老师,让30个学生完成一道题目,并检查他们的结果是

2020-09-16 11:19:22 203

原创 Linux 网络 I/O 模型

概述I/O 操作是所有程序开发人员必须了解以及掌握的技术,因为它关乎系统之间的交互和数据传输。本篇博客我就来简单介绍几种常见的 I/O 模型。Linux 网络 I/O 模型根据网络编程对 I/O 模型的分类,常见的 Linux 有以下五种模型:阻塞 I/O 模型非阻塞 I/O 模型I/O 复用模型信号驱动 I/O 模型异步 I/O阻塞 I/O 模型阻塞 I/O 是最常见的 I/O 模型,默认情况下,所有文件操作都是阻塞的。举个例子:在进程空间中调用 ecvform 函数,其系统

2020-09-08 14:39:36 119

原创 LeetCode 85.最大矩形(穷举 + dp + 栈)

题目描述穷举法无论拿到什么问题,首先试着用穷举法解答,这样可以有效的加深对题目的了解以及扩展思路。在本题中,我们可以模拟矩形的左上点坐标以及右下点左边,遍历所有情况就可以找出答案。虽然复杂度很高,但可以快速理解题意:public int maximalRectangle1(char[][] matrix) { if (matrix.length == 0) { return 0; } int result = 0, height = matrix.len

2020-08-31 16:46:22 131

原创 LeetCode 84.柱状图中最大的矩形(穷举 + 栈)

问题描述穷举法(穷举行)对于该问题,首先想到遍历所有柱子情况。这里我们首先根据行来遍历,即依次遍历长度为1、2、3…n 的柱子,计算他们所能形成的最大长方体:其中长方体的长度就是我们遍历的长度,长方体的高度即这些柱子中最低柱子的高度public int largestRectangleArea(int[] heights) { int result = 0, length = heights.length; // 遍历长方体长的起始下标 for (int left =

2020-08-27 16:55:51 141

原创 LeetCode 42.接雨水(dp + 栈 + 双指针)

问题描述暴力解法首先,对于每一列来说,如果它的左边、右边都存在比自己高的柱子,那么它一定能储水,储水量等同于左边和右边最大值中较小的那个值减去自身高度的差。有了这个思路,我们就可以通过暴力遍历的方法解决该问题:public int trap(int[] height) { int result = 0; int length = height.length; // 最左和最右的柱子一定不能储水,无需遍历 for (int i = 1; i < length

2020-08-26 14:30:49 159

原创 Java 回调函数详解

概述在整理 Netty 博客中的同步异步模块时,突然遇到回调函数这个概念。起始我心想:回调函数不就是两个函数互相调用么,后来本着认真求是的态度,在知乎查阅了几篇关于回调函数的理解后,我才意识到之前自己的理解相当浅显。因此才有了本篇博客来详细介绍回调函数相关知识。回调函数简单来说,一次回调全过程中,被调用方 调用的 调用方 传来的函数就是 回调函数。这样讲可能比较抽象,还比较绕。这里我通过简单示例加以说明:我去书店买书,书店老板告诉我想买的书暂时没有。我留电话给书店老板,告诉他等有书的时候通知我

2020-08-20 14:37:50 651

原创 Netty 学习笔记(一)、Netty 背景介绍

概述在日常工作过程中,我经常听到同事提起 Netty 这个概念,只知道它是一款易于使用的高性能客户端/服务器框架。再加上公司 SDK 本身对 Netty 做了层层封装,以至于到现在只会使用,不知原理。为了填补这块的知识盲区,我打算就 Netty 学习路线单独开一专题,一来记录学习过程,二来通过博客加深理解,完成学习、理解两开花。背景早期的客户端/服务器基于长连接 Socket 实现,Java 很早就提供了丰富的 Socket API。即使如此,想要实现复杂的客户端/服务器仍需要大量的样板代码。并且通

2020-08-06 15:49:22 200 1

原创 Java 创建对象的几种方式

概述Java 作为面向对象程序开发语言,对象的创建和回收尤为重要。JVM 垃圾收集器完成了对象回收的工作,而对象创建的操作需要程序员自行开发,本篇博客我就来简单介绍几种 Java 常见创建对象的几种方式。类结构本篇博客所有对象创建都基于如下类结构:class Temp implements Serializable, Cloneable { private static final long serialVersionUID = -5143483767663524643L; pr

2020-08-04 18:20:34 432

原创 Java Class类与反射机制详解

概述反射是 java 编程语言所具备的一种高级特性:对于任何一个类,都能知道这个类的属性和方法;对于任何对象,都能调用它的方法和属性,我们把这种动态获取属性信息以及动态调用对象方法的方式称为 反射机制。由于功能的强大性,反射在很多开源框架或是类库中获得非常广泛的使用,本篇博客我就来简单整理一下 java 反射相关的知识。Java 反射本篇博客我打算分以下几个模块展开:Java Class 类Java Class 类Java 反射基于 Class 类对象实现,这里我首先整理 Class

2020-08-04 16:01:42 398

原创 Java 序列化与反序列化

概述在日常开发过程中,有些场景下可能需要将系统应用中的对象信息保存在文件中,此时就需要将对象转换为流文件进行保存。Java 本身也是支持序列化的,本篇博客我就来简单介绍下 Java 序列化相关的知识。Java 序列化与反序列化首先我们来了解下序列化与反序列化的概念:序列化:内存中保存的数据都是暂时的,如果某个对象需要长期保存,这时就需要将对象转化为流文件写入存储媒介中,这个转化的过程就是序列化反序列化:仅仅写入存储媒介肯定是不够的,当后面我们需要使用时还需要读取流文件并转化为对象,这个反

2020-07-23 17:28:30 585

原创 java clone() 方法详解及深克隆与浅克隆

概述clone 翻译过来就是 克隆,顾名思义就是创造一个一模一样的事物。Java 代码中 clone() 方法是 Object 方法,而 Object 又是所有类的父类,也就是说所有 java 对象都可以调用 clone 方法克隆一个和自己 “相同” 的对象。本篇博客我打算系统整理 java clone() 方法的原理以及深克隆和浅克隆的关系。cloneable 接口在正式介绍 clone() 方法前,我们先简单聊聊 cloneable 接口。在编码过程中,一般都是通过实现该接口重写 clone()

2020-07-16 17:03:58 1093 2

原创 redis 系列——5、跳跃表

概述上篇博客我简单介绍了 redis 字典的实现原理,本篇博客我打算整理 redis 跳跃表实现原理。关于抽象概念跳跃表相关知识可以 点击这里 查看我之前的博客。跳跃表跳跃表有一种 有序 数据结构,它通过在每个节点中维护多个指向其他节点的指针达到快速访问的目的。跳跃表查询的平均复杂度为 O(log n),最坏复杂度为 O(n)。在大多数情况下,它的效率和平衡树差不多,但技术难度上跳跃表相比平衡树简单许多。目前绝大多数程序使用跳跃表代替平衡树。redis 使用跳跃表作为有序集合键(zSet)的实现

2020-07-15 17:44:19 231

原创 常用抽象数据结构系列——1、跳跃表

概述这个系列我打算整理一些常用 抽象 数据结构,抽象是指不通过代码,我尽可能通过表图文字的形式说清楚它的规则,通过这些规则加深对它的理解,这也是为什么我要单独开一个系列的主要原因。本篇所整理的跳跃表对我来说不怎么常见,因为我几乎很少使用,最近在整理 redis...

2020-07-10 17:32:35 301

原创 redis 系列——4、redis 字典

概述上篇博客我简单介绍了 redis 哈希表相关知识,本篇博客我打算在哈希表的基础上,简单整理一下 redis 字典的实现原理字典字典又称为符号表、关联数组,映射等,它是一种保存键值对的抽象数据结构。键值对:字典中,一个键可以和一个值进行关联,这些关联的键和值就称为键值对。字典中的键是独一无二的,程序可以在字典中根据键查找与之关联的值,或通过键来更新值,删除值等。...

2020-07-07 11:27:38 186

原创 redis 系列——3、redis 哈希表原理

概述上篇博客我简单整理了 redis 中链表的实现原理。本篇博客我打算就哈希类型简单整理一下。redis 数据类型redis 有以下五种常用的数据类型:String:字符串类型Hash:哈希类型list:链表类型set:集合类型zSet:有序集合类型1、哈希表redis 哈希表使用头文件 dict.h 中的 dictht 接口定义:typedef struct dictht { // 哈希表数组 dictEntry **table; // 哈希表大小

2020-07-07 10:42:15 604

原创 redis 系列——2、redis 链表原理

概述上篇博客我简单介绍了 redis 字符串的实现原理。除了字符串外,链表作为一种常用的数据结构,提供了高效的节点重排能力以及顺序性的节点访问。redis 使用的C语言没有内置链表结构,本篇博客我就来整理下 redis 链表类型的实现。redis 数据类型redis 有以下五种常用的数据类型:String:字符串类型Hash:哈希类型list:链表类型set:集合类型zSet:有序集合类型1、List 链表类型C语言默认是不支持链表的,redis 使用头文件 adlish.h 中

2020-07-06 15:57:51 192

原创 redis 系列——1、redis 字符串原理

概述redis 作为目前市面上应用最广泛的 key-value 非关系型数据库经常在项目中使用,它的高性能以及线程安全等优势可以在很多场景中大放异彩。从本篇开始,我将通过一个系列的博客系统的整理 redis 相关的知识。本篇先从它的基础类型开始,简单介绍下 redis 都有哪些数据类型。redis 数据类型redis 有以下五种常用的数据类型:String:字符串类型,一个 key 对应一个字符串Hash:哈希类型,一个 key 对应一个 hash 关系list:列表类型,一个 key 对应

2020-07-06 11:25:56 389 3

原创 透过源码看本质——1、HashMap

概述HashMap 作为平时开发过程中常见的数据结构经常被用到,网上关于它的博文已经有非常多,为了加深我对它的理解,我计划就 JDK1.8 版本,通过源码的形式整理下它的原理。HashMapHashMap在源码中是这样定义的:public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable,Serializable这里我通过简单类图描述一下这几个类之间的关系:

2020-07-02 17:07:53 134

原创 抽象理解进程和线程

概述在前几篇博客中,我系统的整理了上下文切换和用户态以及内核态相关的知识,在整理过程中多次出现进程以及线程的概念。在学习其它博客时,我发现大部分内容前后矛盾,无法做到自圆其说,作为读者我也看得云里雾里,完全搞不清楚线程和进程的真面目。因此通过本片博客,我打算抽象的描述一下进程和线程的关系及作用。进程和线程关于为什么要抽象的描述进程和线程是因为:进程和线程本身就是两个抽象的概念。作为 java 开发者的我深受 面向对象 思想的影响(毒害),总是下意识的把任何概念都理解为一种对象。这对于理解一些抽象概

2020-06-30 16:40:15 324

原创 CPU上下文切换详解

概述上篇博客我简单介绍了用户态以及内核态相关知识,然而在实际并发专题中,除了CPU状态的切换,CPU的上下文切换也非常重要。本篇博客我就来简单介绍下CPU上下文切换相关的知识。CPU 上下文我们知道 linux 操作系统是一个多任务处理系统,它支持远超过CPU数量的任务 “并发” 执行。这里的并发不是说同一时刻一起执行,而是指多个任务快速切换执行,因为切换的速度极快,给人一种多个任务同时执行的错觉。而每个任务执行前,CPU都需要知道这个任务从哪里开始执行,从哪里开始加载,也就是需要系统提前设置好

2020-06-30 14:43:23 1172

原创 用户态和内核态

概述在前面关于锁的博客中,我多次提到线程的状态切换,即线程状态由用户态切换到内核态。本篇博客我就这两个概念简单整理一下。分级保护域分级保护域,经常被叫做保护环,又称环形保护、CPU环,简称 rings。这是一种用来在发生故障时保护数据和功能以及避免恶意操作的设计方式。简单来说,根据这种设计方式,计算机资源被划分为不同访问权限。根据权限从高到低的顺序,rings 依次划分为 ring 0 到 ring n,不同的操作系统会划分不同的层级。大多数情况下我们只使用其中两种:最高权限的 ring0 和 用

2020-06-29 15:51:36 258

原创 8、java 线程模型

概述前面几篇博客我系统的整理了 java 线程类 Thread 的使用、状态及并发安全性问题。本篇博客我打算简单的介绍一下 java 线程和操作系统线程之间的关联,以及 java 线程如何被调度。java 线程模型本篇博客我打算分以下几个模块展开:线程和进程线程模型1、进程和线程线程和进程的概念常常在操作系统中被提到,一般它们都是这样被定义的:进程是操作系统分配资源的基本单位线程是 CPU 调度的基本单位早期的操作系统中只有进程的概念,CPU 通过直接调用进程完成任务。任务的

2020-06-24 17:20:08 291

原创 Java无锁系列——2、CAS 实现原理 Unsafe 类简单介绍

概述在上篇博客中,我简单介绍了无锁同步 CAS 如何使用以及部分它的特性。本篇我打算整理一下 CAS 的实现原理即 Unsafe 类相关的知识。Unsafe本篇博客分以下几个模块展开:Unsafe 类简单介绍CAS 更新基础类型原理CAS 更新对象引用原理CAS 更新数组类型原理CAS 更新对象属性原理Unsafe 类方法总结Unsafe 类实例1、Unsafe 类简单介绍snSafe 类处于包 sun.misc 下,该包由 sun 公司内部实现,不属于 J2EE 开发规范。

2020-06-22 20:25:15 345

原创 “==”、equals() 和 hashCode()

概述本篇博客简单介绍一下 equals() 方法和 “==” 的区别,顺带解释一下为什么在重写 equals() 方法后还需要重写 hashCode() 方法。equals() 和 ==在 java 代码中,一般通过 == 判断两个对象的地址是否相等。如果比较的是常量数据,则比较他们的值是否相等。equals() 是 Object 类方法,它的源码实际上也是直接调用的 == :public boolean equals(Object obj) { return (this == obj)

2020-06-21 00:14:41 176

原创 Java无锁系列——1、CAS 简单介绍及使用

概述在前一个系列中,我简单整理了 synchronized 锁的使用和原理,即采用 Monitor 管程对象控制同时只能有一个线程占有锁对象,以此来保证多线程场景下的线程安全。除了这种通过锁对象实现的同步,还有一种在不使用锁的情况下实现同步的方式,这种无锁同步的实现原理是 CAS。本篇我就来介绍下 CAS 相关的知识。无锁同步本篇博客分以下几个模块展开:乐观锁和悲观锁CAS 简单介绍CAS 如何使用CAS 的优势如何解决 ABA 问题CAS 实现自旋锁1、乐观锁和悲观锁在正式介

2020-06-16 19:55:29 922 1

原创 Java锁系列——3、JVM 对 Synchronized 锁优化

概述在上篇的博客中,我们提到轻量级锁、偏向锁、重量级锁等概念。在早期的 java 虚拟机中,synchronized 锁基于 monitor 管程对象实现,而 monitor 对象又基于底层操作系统锁来保证同步。这就意味着,所有线程切换时都需要从 用户态 切换到 核心态。这也是早期 synchronized 锁效率低下的主要原因。在 jdk6 之后,jvm 对 syncrhonized 锁进行了一系列优化。本篇博客我们就来整理一下 jvm 都对 synchronized 锁进行了哪些优化。JVM 对

2020-06-11 22:47:51 191

原创 Java锁系列——2、Synchronized 锁实现原理

概述上篇博客我简单介绍了 Synchronized 锁的三种使用方法及部分特性,作为开发者,适当的了解原理可以加深我们对它的理解。因此,本篇博客打算从底层介绍一下 Synchronized 锁实现的原理。Synchronized 锁实现原理本篇博客从以下几个模块展开:对象头Monitor 对象显式同步和隐式同步Monitor 对象与线程状态1、 对象头在 java 代码中,对象创建完成后,在堆区分以下三个模块存储:对象头实例数据填充数据其中实例数据主要保存类属性及数据信

2020-06-10 22:31:47 289

原创 7、java 对象和线程安全性问题

概述前面几篇博客我们介绍了 java 代码中如何创建并启动线程。而多线程在提高效率的同时也带来了线程安全性问题,本篇博客我们主要整理一下java对象和线程安全性问题的关系。Java对象与线程安全本篇博客从以下四个模块展开:线程安全问题产生的原因线程安全与全局变量线程安全与局部变量线程安全与其他资源1、线程安全问题产生的原因之前的多线程博客中我们提到:如果存在多个线程同时写一块内存空间,就可能产生线程安全问题。对应到 java 代码中,也就是说:如果存在多个线程同时写某个对象值,就可

2020-06-08 20:43:57 1077

原创 6、Java 线程状态切换图

概述上一篇博客我整理了 Java 线程常用的方法,其中提到 getState() 方法可以获取线程的状态。本篇博客主要通过流程图的方式整理线程状态的转换方式:线程状态切换图本篇博客主要从以下两个模块展开:Java 线程状态状态转换图1、Java 线程状态Java Thread 源码中,线程状态通过枚举类 State 表示,其中线程状态主要有以下六种:NEW:刚刚创建,还没有启动的线程。即 new 出来的 Thread 对象RUNNABLE:正在运行的线程,即使CPU没有调度

2020-06-06 22:13:22 159

原创 5、Java 线程类常用方法

概述线程在运行过程中可以通过调用方法来修改状态和属性。本篇我们主要介绍 Java 线程常见的方法Java 线程常见方法本篇我打算从以下三种类型出发,依次介绍常见的线程方法:实例方法静态方法Object() 继承方法1、实例方法2、静态方法Java 线程类常见的静态方法有以下这些:currentThread()yield()sleep()2-1、currentThread()public static native Thread currentThread();

2020-06-06 13:31:10 466

原创 Java锁系列——1、Synchronized 简单介绍及使用

概述在前面的多线程专栏中,我们提到线程并发所带来的安全性问题。导致安全性问题的主要原因是多个线程同时操作同一块内存空间。在如何解决该问题时,我们提到:通过 锁 的方式强制同时只能有一个线程操作共享内存,其他线程在该线程释放锁后进行抢锁,只有抢到锁的线程才能向下执行,否则就阻塞等待。在JAVA语言中,Synchronized关键字就可以保证同一时刻,只能有一个线程执行某段代码。在某些并发场景中,也是通过它保证线程的安全性。Synchronized本篇主要从以下五个模块展开Synchronized

2020-06-03 18:58:44 152

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除