Java 进阶学习笔记
文章平均质量分 85
Java 进阶学习笔记
南淮北安
好好学习
展开
-
学习 JSON.parseObject 和 JSON.toJSONString 一篇文章就够了
JSON.parseObject 是将Json字符串转化为相应的对象;JSON.toJSONString 是将对象转化为Json字符串两者主要用于前后台的数据传输过程中使用前需要先导入该包:<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version></原创 2022-04-19 11:26:49 · 33644 阅读 · 3 评论 -
学习设计模式之抽象工厂模式
首先需要了解下工厂模式和抽象工厂的区别:工厂方法模式是生产单个同类型的不同产品,例如戴尔电脑,苹果电脑而抽象工厂模式生产的是多个不同类型的不同产品,所以必须将共同点抽象出来,例如戴尔CPU,苹果CPU,抽象的接口就是CPU。(再比如:戴尔GPU,苹果GPU,抽象的接口就是GPU)。这是为了遵守面向对象的原则之一,面向接口编程而不是内容编程。简单工厂:提供方法的工厂,比如排队去买面,只有一个窗口,具体什么面交由窗口内打饭阿姨决定,通过 if-else 判断得到工厂方法:提供工厂的方法,比如买面原创 2022-04-15 14:47:09 · 1921 阅读 · 1 评论 -
(建造者模式)链式编程之 @Builder 和 @Accessors 学习
建造者模式:建造者模式又叫创建者模式,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。关于 Build的使用可以参考:一篇文章带你使用 Builder 模式实现构建器文章目录一、@Accessors二、@Builder 和 @Accessors 区别一、@Accessors示例:@Data@Accessors(chain = true)p原创 2022-04-12 20:13:16 · 1177 阅读 · 0 评论 -
Java 静态成员类优于非静态成员类
嵌套类分为四种:静态成员类、非静态成员类、匿名类以及局部类,除了第一种,其余三种称为内部类。一、静态成员类类被声明为静态类,必须为静态成员类静态类,一定为静态成员类静态成员类作为公有的辅助类,只有与它的外部类一起使用才有意义声明方式:静态类:public static class StaticClass{}非静态类:public class ClassName访问权限:静态类只能访问类内部的静态成员非静态类可以访问类中所有成员静态和非静态的唯一区别,静态成员类的声明中包含修饰符 st原创 2022-04-05 10:29:39 · 1020 阅读 · 0 评论 -
一篇文章带你搞懂 Java 注解的原理
文章目录一、注解的本质二、元注解三、Java 内置的三大注解四、注解与反射五、总结一、注解的本质注解的本质就是一个继承了 Annotation 接口的接口例如:JDK 内置注解的定义:@Target(ElementType.METHOD)@Retention(RetentionPolicy.SOURCE)public @interface Override {}这是注解 @Override 的定义,其实它本质上就是:public interface Override extends A转载 2021-11-12 17:05:52 · 6455 阅读 · 0 评论 -
一篇文章理解序列化和反序列化
内存中的数据对象只有转换为二进制流才可以进行数据持久化和网络传输。将数据对象转换为二进制流的过程称为对象的序列化,反之,将二进制流恢复为数据对象的过程称为反序列化序列化需要保留充分的信息以恢复数据对象,但是为了节约存储空间和网络宽带,序列化后的二进制流又要尽可能小。序列化常见的使用场景时RPC框架的数据传输。常见的序列化方式:Java原生序列化(Serializable),hessian序列化,JSON序列化文章目录一、Java原生序列化(Serializable)二、Hessian序列化三、JSO原创 2021-11-09 19:50:54 · 156 阅读 · 0 评论 -
一篇文章带你总结 Lambada 表达式常见使用
(parameters) -> expression 或 (parameters) ->{ statements; }(1)可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。(2)可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。(3)可选的大括号:如果主体包含了一个语句,就不需要使用大括号。(4)可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。public class Test {原创 2021-11-07 22:50:03 · 642 阅读 · 0 评论 -
Java 中 Stream 流学习一篇文章就够了
文章目录一、Stream 概述二、Stream 的创建1. 集合创建流2. 数组创建流3. Stream 的静态方法创建流4. 顺序流和并行流的区别三、Stream 的使用一、Stream 概述Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的 Lambda ,给我们操作集合(Collection)提供了极大的便利。Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等Stream可以由数组或集合创转载 2021-11-06 15:52:46 · 537 阅读 · 0 评论 -
深入学习 Java Enum 枚举类
文章目录一、基本概念二、取得枚举的信息三、为每一个枚举对象属性赋值1. 通过构造方法为属性赋值2. 通过 setter方法为属性赋值四、使用比较器一、基本概念已经知道使用 eunm 关键字可以定义一个枚举,该关键字表示的是 java.lang.Enum类型,即使用 enum 声明的枚举类型就相当于定义一个类,此类默认继承 java.lang.Enum 类。java.lang.Enum 的定...原创 2020-02-19 11:17:01 · 1105 阅读 · 0 评论 -
深入理解深拷贝和浅拷贝一篇文章就够了
文章目录一、拷贝1. 引用拷贝2. 对象拷贝二、浅拷贝和深拷贝三、浅拷贝四、深拷贝一、拷贝1. 引用拷贝创建一个指向对象的引用变量的拷贝。public class QuoteCopy { public static void main(String[] args) { Teacher teacher = new Teacher("riemann", 28); Teacher otherTeacher = teacher; System.out.转载 2021-11-02 21:04:16 · 503 阅读 · 0 评论 -
学习单元测试 Mockito 一篇文章就够了
文章目录一、什么是 Mockito二、为什么使用 Mockito三、Mockito 基本使用1. 导入 Maven 依赖2. 创建Mock对象3. 配置 Mock 对象4. Mock 抛出异常四、检验 Mock 对象的方法调用五、使用 spy() 部分模拟对象六、常用操作1. 验证mock对象是否执行了某些操作2. 打桩3. 参数匹配器4. 验证方法的调用次数/最多/最少/从不等5. 返回值为void的方法调用时抛异常打桩6. 验证执行顺序7. 验证没有任何交互8. 检查是否还有没有验证的交互9. 简化Mo翻译 2021-10-30 21:36:32 · 3526 阅读 · 2 评论 -
学习单元测试常用的断言 assertTrue 和 assertEquals 一篇文章就够了
阿里规范强制要求:单元测试应该是全自动执行的,并且非交互式的。测试用例通常是被定期执行的,执行过程必须完全自动化才有意义。输出结果需要人工检查的测试不是一个好的单元测试。单元测试中不准使用System.out来进行人肉验证,必须使用assert来验证。断言常用的功能:认识断言 assert单元测试时,常用的有 assertEquals 和 assertTrue都能判断两个值是否相等一、assertEqualsassertEquals 如果预期值与真实值相等,则运行success,反之Fai原创 2021-10-30 20:44:58 · 13225 阅读 · 0 评论 -
学习 Java JUnit 单元测试一篇文章就够了
文章目录一、测试的类型二、单元测试三、Junit 简单使用四、常用注解五、在 IntelliJ IDEA 中使用 JUnit 4一、测试的类型(1)单元测试(Unit test):单元测试关注单一的类. 它们存在的目的是检查这个类中的代码是否按照期望正确运行.(2)集成测试(Integration test):顾名思义, 集成测试是检查开发的模块和其他模块整合时是否正常工作.虽然集成测试的代码影响范围比单元测试要广, 但是集成测试和单元测试一样, 也是针对于开发者而言的.(3)端到端测试(End-原创 2021-10-30 20:41:52 · 621 阅读 · 0 评论 -
一篇文章带你深入理解 Comparable 和 Comparator
文章目录一、Comparable二、Comparator三、两者比较一、Comparable此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。// TestDemo 类@Data@Builderpublic class Tes原创 2021-10-29 12:58:30 · 256 阅读 · 0 评论 -
一篇文章带你搞懂慢SQL以及优化的策略
文章目录一、什么是慢SQL ?二、为什么要对慢SQL进行优化?三、数据库性能1. 最大数据量2. 最大并发数3. 查询耗时0.5秒4. 具体实施四、数据库表的设计1. 数据类型2. 避免空值3. text 类型优化五、索引优化1. 索引分类2. 索引优化六、SQL 优化1. 分批处理2. 操作符<>优化3. OR优化4. IN优化5. 不做列运算6. 避免Select all7. Like优化8. Join 优化9. Limit 优化七、其他SQL一、什么是慢SQL ?分析MySQL语句查询原创 2021-10-27 22:50:39 · 13949 阅读 · 0 评论 -
(面经总结)一篇文章带你完整学习 MySQL 事务隔离级别的实现原理
在MySQL的众多存储引擎中,只有InnoDB支持事务,所有这里说的事务隔离级别指的是InnoDB下的事务隔离级别。在MySQL中,默认的隔离级别是REPEATABLE-READ(可重复读),mysql的默认隔离级别解决了脏读、幻读、不可重复读问题文章目录一、数据库的隔离级别二、MVCC1. 增删改查2. 快照读和当前读三、一致性非锁定读和锁定读四、悲观锁和乐观锁五、锁六、理论分析七、实验一、数据库的隔离级别(1)未提交读(Read Uncommitted)A事务只要修改了数据,无论有没有提交,其转载 2021-04-01 21:10:48 · 281 阅读 · 0 评论 -
一篇文章带你搞定 Java 日志框架 slf4j
文章目录一、为什么要使用 slf4j ?一、为什么要使用 slf4j ?门面模式:slf4j是门面模式的典型应用,因此在讲slf4j前,先简单学习下门面模式,门面模式,其核心为外部与一个子系统的通信必须通过一个统一的外观对象进行,使得子系统更易于使用用一张图来表示门面模式的结构为:门面模式的核心为Facade即门面对象,门面对象核心为几个点:知道所有子角色的功能和责任将客户端发来的请求委派到子系统中,没有实际业务逻辑不参与子系统内业务逻辑的实现为什么要使用 slf4j:我们自己原创 2021-10-19 15:29:22 · 1323 阅读 · 1 评论 -
一篇文章带你深入理解 try-with-resource
文章目录一、为什么引入 try-with-resource?二、try-with-resource 的使用三、原理探究四、注意事项一、为什么引入 try-with-resource?所有被打开的系统资源,比如流、文件或者Socket连接等,都需要被开发者手动关闭,否则随着程序的不断运行,资源泄露将会累积成重大的生产事故。当然可以将处理资源关闭的代码写在finally块中。然而,如果你同时打开了多个资源,那么将会出现噩梦般的场景:public class Demo { public stat转载 2021-10-18 17:25:24 · 1432 阅读 · 0 评论 -
搞定 WeakHashMap 的工作原理一篇文章就够了!!!
文章目录一、什么是 WeakHashMap?二、为什么需要 WeakHashMap?三、WeakHashMap 的例子四、WeakHashMap 的使用场景五、WeakHashMap 的数据结构1. 类的定义2. 常量与变量3. Entry 类4. 类关系图六、WeakHashMap 的弱键回收1. put 数据2. get 数据3. 弱键如何回收?一、什么是 WeakHashMap?从名字可以得知主要和Map有关,不过还有一个Weak,我们就更能自然而然的想到这里面还牵扯到一种弱引用结构,因此想要彻底翻译 2021-10-14 15:46:23 · 1455 阅读 · 0 评论 -
一篇文章带你深入探讨 DECIMAL 解决 MySQL 数据精度丢失问题
文章目录一、数据精度丢失是如何表现的?二、精度丢失是什么原因?一、数据精度丢失是如何表现的?不要盲目的说float和double精度可能发生丢失,而是说在存取时因为精度不一致会发生丢失,当然这里的丢失指的是扩展或者截断了,丢失了原有的精度。decimal是好,但不是说不会发生任何精度丢失。如果问题看得不深入,总会以偏概全。我们知道,mysql存储小数可以使用float、double、decimal等。这些类型存储的小数精度都比较高。我们平时应用最多的就是两位小数点,所以,这些类型都是可以满足的。转载 2021-10-10 17:25:35 · 8103 阅读 · 4 评论 -
一篇文章带你使用 Builder 模式实现构建器
文章目录一、为什么要引入 Builder 模式二、具体使用一、为什么要引入 Builder 模式静态工厂和构造器都有个共同的缺陷,不能很好的扩展到大量的可选参数比如包装食品外面显示的营养成分标签,这些标签中,有几个是必须的,也有很多是可选的当然,当可选参数比较多时,采用 重叠构造器模式也可以,但是此时代码的可读性不好,也很难编写public class NutritionFacts { private final int servingSize; private final int原创 2021-10-09 15:44:42 · 420 阅读 · 0 评论 -
学习多线程中的 Future 模式一篇文章就够了 !!!
文章目录一、Future 模式二、Future模式的主要角色三、Future模式的简单实现四、JDK中的Future模式五、Guava对Future模式的支持一、Future 模式Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用。当我们需要调用一个函数方法时,如果这个函数执行得很慢,那么我们就要进行等待。但有时候,我们可能并不急着要结果。因此,我们可以让被调者立即返回,让它在后台慢慢处理这个请求。对于调用者来说,则可以先处理一些其他任务,在真正需要数据的场合再去尝试获得需翻译 2021-05-26 22:40:39 · 5282 阅读 · 0 评论 -
(面经总结)一篇文章带你搞懂微服务中的 RPC
文章目录一、RPC二、本地过程的调用过程三、远程过程调用1. Call ID 映射2. 序列化和反序列化3. 网络传输一、RPCRPC,即远程过程调用,比如两个服务器A,B,一个应用部署在 A 服务器上,想要调用B 服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。简单来说,就是像调用本地服务一样调用远程服务已经有HTTP协议了,为什么还需要RPC方式实现分布式系统:使用 HTTP 还需要搭配 web 服务, rpc 可以避免这转载 2021-03-12 21:57:49 · 1172 阅读 · 0 评论 -
一篇文章带你搞定 Java 多线程用到的静态代理模式
代理模式指为对象提供一种通过代理的方式来访问并控制该对象行为的方法。在客户端不适合或者不能够直接引用一个对象时,可以通过该对象的代理对象来实现对该对象的访问,可以将该代理对象理解为客户端和目标对象之间的中介者文章目录一、静态代理二、多线程中的静态代理模式一、静态代理静态代理实现的条件:真实角色,代理角色,两者实现相同的接口就相当于买房,可以委托房产中介,这就是把代理角色引用真实角色My my = new My();//代理角色中介,引入真实角色购买房的人HouseCompany user_m原创 2021-03-11 16:02:26 · 326 阅读 · 3 评论 -
一篇文章带你搞定 Java 高并发中的网络 NIO
Java NIO是New IO的简称,它是一种可以替代Java IO的一套新的IO机制。它提供了一套不同于Java 标准IO的操作机制。严格来说,NIO与并发并无直接的关系,但是使用NIO技术可以大大提高线程的使用效率。对于标准的网络IO来说,我们会使用Socket进行网络的读写。为了让服务器可以支持更多的客户端连接,通常的做法是为每一个客户端连接开启一个线程。文章目录一、基于Socket的服务端多线程模式二、使用NIO进行网络编程三、使用NIO来实现客户端一、基于Socket的服务端多线程模式这里翻译 2021-01-25 17:23:59 · 535 阅读 · 0 评论 -
一篇文章带你搞定高性能的生产者-消费者模式:无锁的实现
用BlockigQueue队列实现生产者和消费者是一个不错的选择。它可以很自然地实现作为生产者和消费者的内存缓冲区。但是BlockigQueue队列并不是一个高性能的实现,它完全使用锁和阻塞等待来实现线程间的同步。在高并发场合,它的性能并不是特别的优越。就像之前我已经提过的:ConcurrentLinkedQueue是一个高性能的队列,但是BlockingQueue队列只是为了方便数据共享。而ConcurrentLinkedQueue队列的秘诀就在于大量使用了无锁的CAS操作。同理,如果我们使用CAS来实翻译 2021-01-21 23:40:39 · 1967 阅读 · 0 评论 -
一篇文章带你搞定 HTTPS
文章目录一、HTTP加上加密处理和认证以及完整性保护后即是HTTPS二、HTTPS是身披SSL外壳的HTTP三、相互交换密钥的公开密钥加密技术1. 共享密钥加密的困境2. 使用两把密钥的公开密钥加密3. HTTPS采用混合加密机制四、证明公开密钥正确性的证书1. 可证明组织真实性的EV SSL证书2. 用以确认客户端的客户端证书3. 认证机构信誉第一4. 由自认证机构颁发的证书称为自签名证书五、HTTPS的安全通信机制1. SSL和TLS2. SSL速度慢吗3. 为什么不一直使用HTTPS一、HTTP加上翻译 2021-01-20 21:21:40 · 607 阅读 · 0 评论 -
一篇文章带你搞定 HTTP 的缺点
到现在为止,我们已了解到HTTP具有相当优秀和方便的一面,然而HTTP并非只有好的一面,事物皆具两面性,它也是有不足之处的。到现在为止,我们已了解到HTTP具有相当优秀和方便的一面,然而HTTP并非只有好的一面,事物皆具两面性,它也是有不足之处的。通信使用明文(不加密),内容可能会被窃听不验证通信方的身份,因此有可能遭遇伪装无法证明报文的完整性,所以有可能已遭篡改这些问题不仅在HTTP上出现,其他未加密的协议中也会存在这类问题。除此之外,HTTP本身还有很多缺点。而且,还有像某些特定的Web翻译 2021-01-20 21:21:29 · 594 阅读 · 0 评论 -
一篇文章带你搞定 HTTP 中其他首部字段
HTTP首部字段是可以自行扩展的。所以在Web服务器和浏览器的应用上,会出现各种非标准的首部字段。接下来,我们就一些最为常用的首部字段进行说明。X-Frame-OptionsX-XSS-ProtectionDNTP3P文章目录一、X-Frame-Options二、X-XSS-Protection三、DNT四、P3P一、X-Frame-Options首部字段X-Frame-Options属于HTTP响应首部,用于控制网站内容在其他Web网站的Frame标签内的显示问题。其主要目的是为了防翻译 2021-01-20 21:21:16 · 249 阅读 · 0 评论 -
一篇文章带你搞定 HTTP 中为 Cookie 服务的首部字段
管理服务器与客户端之间状态的Cookie,虽然没有被编入标准化HTTP/1.1的RFC2616中,但在Web网站方面得到了广泛的应用。Cookie的工作机制是用户识别及状态管理。Web网站为了管理用户的状态会通过Web浏览器,把一些数据临时写入用户的计算机内。接着当用户访问该Web网站时,可通过通信方式取回之前存放的Cookie。调用Cookie时,由于可校验Cookie的有效期,以及发送方的域、路径、协议等信息,所以正规发布的Cookie内的数据不会因来自其他Web站点和攻击者的攻击而泄露。至201翻译 2021-01-20 21:21:04 · 395 阅读 · 0 评论 -
一篇文章带你搞定 HTTP 中的实体首部字段
实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息。文章目录一、Allow二、Content-Encoding三、Content-Language四、Content-Length五、Content-Location六、Content-MD5七、Content-Range八、Content-Type九、Expires十、Last-Modified一、Allow首部字段Allow用于通知客户端能够支持Request-URI指定资源的所有HTTP方法翻译 2021-01-20 21:20:52 · 228 阅读 · 0 评论 -
一篇文章带你搞定高并发程序中的生产者-消费者模式
生产者-消费者模式是一个经典的多线程设计模式,它为多线程间的协作提供了良好的解决方案。在生产者-消费者模式中,通常有两类线程,即若干个生产者线程和若干个消费者线程。生产者线程负责提交用户请求,消费者线程则负责具体处理生产者提交的任务。生产者和消费者之间则通过共享内存缓冲区进行通信。图 5.1 展示了生产者-消费者模式的基本结构。三个生产者线程将任务提交到共享内存缓冲区,消费者线程并不直接与生产者线程通信,而是在共享内存缓冲区中获取任务,并进行处理注意:生产者-消费者模式中的内存缓冲区的主要功能是数据在翻译 2021-01-21 22:22:02 · 447 阅读 · 1 评论 -
一篇文章带你搞定高并发程序中的不变模式
在并行软件开发过程中,同步操作似乎是必不可少的。当多线程对同一个对象进行读写操作时,为了保证对象数据的一致性和正确性,有必要对对象进行同步,但是同步操作对系统性能有损耗。为了尽可能地去除这些同步操作,提高并行程序性能可以使用一种不可改变的对象,依靠对象的不变性,可以确保其在没有同步操作的多线程环境中依然保持内部状态的一致性和正确性。这就是不变模式不变模式天生就是多线程友好的,它的核心思想是,一个对象一旦被创建,它的内部状态将永远不会发生改变。没有一个线程可以修改其内部状态和数据,同时其内部状态也绝不会自行原创 2021-01-21 22:21:33 · 244 阅读 · 0 评论 -
一篇文章带你搞定 HTTP 中的请求首部字段
请求首部字段是从客户端往服务器端发送请求报文中所使用的字段,用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容。文章目录一、Accept二、Accept-Charset三、Accept-Encoding四、Accept-Language五、Authorization六、Expect七、From八、Host九、If-Match十、If-Modified-Since十三、If-Unmodified-Since十四、Max-Forwards十五、Proxy-Authorization十六、Ran翻译 2021-01-20 21:22:32 · 250 阅读 · 0 评论 -
一篇文章带你探讨 并发多线程中的单例模式
单例模式是设计模式中使用最为普遍的模式之一。它是一种对象创建模式,用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例。在Java中,这样的行为能带来两大好处。对于频繁使用的对象,可以省略new操作花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销。由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻GC压力,缩短GC停顿时间。严格来说,单例模式与并行没有直接的关系。讨论这个模式,是因为它实在是太常见了,我们不可避免会在多线程环境中使用它们。并且,系统中使用翻译 2021-01-21 22:21:11 · 295 阅读 · 0 评论 -
一篇文章带你搞定 HTTP 报文的首部和首部字段
文章目录一、HTTP报文首部二、HTTP 首部字段1. HTTP首部字段传递重要信息2. HTTP首部字段结构3. 4 种 HTTP 首部字段类型4. HTTP/1.1 首部字段一览5. 非HTTP/1.1首部字段6. End-to-end首部和Hop-by-hop首部三、HTTP/1.1 通用首部字段1. Cache-Control一、HTTP报文首部HTTP协议的请求和响应报文中必定包含HTTP首部。首部内容为客户端和服务器分别处理请求和响应提供所需要的信息。对于客户端用户来说,这些信息中的大部分翻译 2021-01-20 21:20:24 · 1033 阅读 · 0 评论 -
一篇文章带你搞定 HTTP/1.1 通用首部字段
文章目录1. Cache-Control2. Connection3. Date4. Pragma5. Trailer6. Transfer-Encoding7. Upgrade8. Via9. Warning通用首部字段是指,请求报文和响应报文双方都会使用的首部。1. Cache-Control通过指定首部字段Cache-Control的指令,就能操作缓存的工作机制。指令的参数是可选的,多个指令之间通过“,”分隔。首部字段Cache-Control的指令可用于请求及响应时。Cache-C翻译 2021-01-20 21:20:37 · 264 阅读 · 0 评论 -
一篇文章带你理清有关死锁的问题
在学习了无锁之后,让我们重新回到锁的世界吧!在众多的应用程序中,使用锁的情况一般要多于无锁。因为对于应用来说,如果业务逻辑很复杂,会极大增加无锁的编程难度。但如果使用锁,我们就不得不对一个新的问题引起重视—死锁。什么是死锁呢?通俗地说,死锁就是两个或者多个线程相互占用对方需要的资源,而都不进行释放,导致彼此之间相互等待对方释放资源,产生了无限制等待的现象。死锁一旦发生,如果没有外力介入,这种等待将永远存在,从而对程序产生严重的影响。用来描述死锁问题的一个有名的场景是哲学家就餐问题,如图4.3所示。哲学家翻译 2021-01-21 22:20:47 · 211 阅读 · 0 评论 -
一篇文章带你搞定并发多线程里的无锁
就人的性格而言,可以分为乐天派和悲观派。对于乐天派来说,他们总是会把事情往好的方面想。他们认为所有事情总是不太容易发生问题,出错是小概率的,因此可以大胆地做事。如果真的不幸遇到了问题,则努力解决问题。而对于悲观的人来说,他们总是担惊受怕,认为出错是一种常态,所以无论大小事情都考虑得面面俱到,为人处世,确保万无一失。对于并发控制而言,锁是一种悲观的策略。它总是假设每一次的临界区操作会产生冲突,因此,必须对每次操作都小心翼翼。如果有多个线程同时需要访问临界区资源,则宁可牺牲性能让线程进行等待,所以说锁会阻塞线翻译 2021-01-21 22:20:31 · 880 阅读 · 2 评论 -
一篇文章带你搞明白与 HTTP 协作的 Web 服务器
一台 Web 服务器可搭建多个独立域名的 Web 网址,也可作为通信路径上的中转服务器提升传输效率。文章目录一、用单台虚拟主机实现多个域名二、通信数据转发程序:代理、网关、隧道1. 代理2. 网关3. 隧道三、保存资源的缓存1. 缓存的有效期限2. 客户端的缓存一、用单台虚拟主机实现多个域名HTTP/1.1规范允许一台HTTP服务器搭建多个Web站点。比如,提供Web托管服务(Web Hosting Service)的供应商,可以用一台服务器为多位客户服务,也可以以每位客户持有的域名运行各自不同的网站翻译 2021-01-20 21:20:08 · 224 阅读 · 0 评论