目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

线程安全与程序性能

线程安全  当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象时线程安全的。----《并发编程实战》 主要是两个问题 数据争用:多个线程同时修改共享数据,会造成错误数据。(原子性) 竞争条件:操作顺序造成的问题,例如:读取发生在写入之前。(可见性、重排序) 线程安全带来的性能开销  运行速度、设计成本(增加编码的复杂度)、trade off 线程安全问题分类 运行结果错误:a++ 多线程下出现消失的请求现象 活跃性问题:死锁、活锁、饥饿 对象发布和初始化的时候的安全问题:由于顺序源于依然会造成错误,比如在写入之前就读取了。 * 发布:一个对象被声明为public,它就是被发布出去了,或者return 对象,或者方法传参 * 初始化 * 逸出: 1、方法返回了一个 private 对象(private 的本意是不让外部访问,这样就没人可以访问此对象了)。 2、还未完成初始化(构造函数完全执行完毕)就把对象提供给外界,比如: 在构造函数中为初....

线程的创建、启动、停止

线程的创建方式:继承 Thread  run()整个都被重写 任务与线程类高度耦合。 每次新建任务都需要创建独立的线程,如果使用 Runnable 则可以利用线程池,大大减少创建线程和销毁线程的开销。 Java 只允许单继承,影响扩展性。 public class MyThread extends Thread { @Override public void run() { System.out.println(Thread.currentThread().getName()); } public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.setName("线程demo"); myThread.start(); } } 线程的创建方式:实现 Runnable  最终调用 target.run() 任务与线程类解耦 可扩展 解决资源开销(利用线程池) public class MyRunable implements Runnable,Serializable {....

并行的世界

并发简史  早期计算机(不包含操作系统),只能从头到尾执行一个程序,并且执行的程序能访问计算机中的所有资源。  操作系统的出现使得计算机每次能运行多个程序,并且不同程序都在单独的进程中运行:操作系统为各个独立执行的进程分配各种资源,包括内存、文件句柄以及安全证书等。计算机中加入操作系统来实现多个程序的同时执行,主要是基于以下原因: 资源利用率(同步等待造成的资源浪费) 公平性(通过时间分片实现用户和程序共享计算机资源) 便利性(多程序开发可以降低单个程序的开发的复杂度) 串行与并行的区别  好处:可以缩短整个流程的时间 串行(5):洗茶具 => 打水 => 烧水(同步等待) => 等水开 => 冲茶 并行(4):打水 => 烧水同时洗茶具 => 水开 => 冲茶 可怕的现实:摩尔定律的失效  摩尔定律:当价格不变时,集成电路上可容纳的元器件的数目,约每隔 18-24 个月便会增加一倍,性能也将提升一倍。这一定律揭示了信息技术进步的速度。 ​  然而,在 2004 年,Intel 的 4GHz 芯片宣布推迟到 2005 年,然后再 200....

基于Redis的sorted set实现排行榜功能

业务需求  排行榜功能是一个很普遍的需求。使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择。 一般排行榜都是有实效性的,比如“用户积分榜”,游戏中活跃度排行榜,游戏装备排行榜等。 需求面临的问题 数据库设计复杂。 并发数较高。 数据要求实时性高。 Redis 相关 API 概述 封装 Redis 工具类 RedisService Service 层(RangingService 使用 Redis 工具类) import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.ZSetOperations; import org.springframework.stereotype.Service; import java.util.LinkedHashMap; import java.util.List; im....

SpringBoot整合Redis

Redis 远程连接配置 [root@localhost ~]# vim /etc/redis/6379.conf bind 0.0.0.0 port 6379 daemonize yes protected-mode no requirepass 123 SpringBoot 整合 Redis 引入依赖   spring-boot-starter-data-redis 包含了 jedis,封装了一类 SpringBoot 与 Redis 的连接工具。 <dependency <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 编写 redisTemplate 的配置类,设置 redisConnectFactory import org.springframework.data.redis.connection.RedisConnectionF....

Redis

TRDB  建立在 DBMS 上,通过 DBMS 处理数据吗,单机物理性能受限、横向多机扩充(分布式引用)困难。 技术特点 使用强存储模式,表、行、字段的建立都需要预先严格定义,并进行相关数据约束。 采用 SQL 技术标准来定义和操作数据库。 采用强事务保证可用性和安全性。 主要采用单机集中式处理方式。 单机的局限性 单机读、写数据的速度瓶颈问题 单机存储数据量有限 服务器的纵向扩展的局限性 NoSQL  主体符合非关系型、分布式、开源、横向扩展能力的数据库。 技术特点 使用弱存储模式(取消数据存入类型的强制检查等一系列技术…),速度快。 没有采用 SQL 技术标准来定义和操作数据库。 采用弱事务或根本没有事务处理机制。 主要采用多机分布式处理(DP, Distributed Processing)。 数据存储结构多元化。 NoSql vs TRDB TRDB 为强数据存储模式,NoSql 为弱数据存储模式 分布式技术是 NoSql 的核心技术思路、TRDB 以集中处理为出发点 TRDB 的事务严格遵循 ACID 原则,而 NoSql 主体遵循 Base 原则 TRDB ....

Dubbo

Dubbo 项目分层 传送门 Duboo 开发环境的搭建 创建项目 # 创建dubbo项目并删除src目录 # 右键dubbo项目,创建user-api子项目 # 右键dubbo项目,创建user-service子项目 # 右键dubbo项目,创建user-web子项目 parent 父项目限定版本 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </b....