Fork me on GitHub

Linux-06-多路复用

Linux-06-多路复用

1. BIO 的缺陷

  • BIO中的B 是 Blocking 的阻塞的意思
  • 作为服务端开发,使用ServerSocket 绑定端口号之后会监听该端口,等待accept事件,accept是会阻塞当前线程
  • 当我们收到accept事件的时候,程序就会拿到客户端与当前服务端连接的Socket
  • 针对这个socket我们可以进行读写,但是呢,这个socket读写都是会阻塞当前线程的。
  • 一般我们会有使用多线程方式进行c/s交互,但是这样很难做到C10K(比如说:1W个客户端就需要和服务端用1W个线程支持,这样的话CPU肯定就爆炸了,同时线程上下文切换也会把机器负载给拉飞。)
阅读更多...

Java-基础-interrupt()

Java-基础-interrupt()

1. InterruptedException

  • 当一个方法后面声明可能会抛出InterruptedException异常时,说明该方法是可能会花一点时间,但是可以取消的方法。
  • InterruptedException的代表方法有:
    • java.lang.Object 类的 wait 方法
    • java.lang.Thread 类的 sleep 方法
    • java.lang.Thread 类的 join 方法
阅读更多...

Leetcode-344-反转字符串

Leetcode-344-反转字符串

思路:双指针

题目描述

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

1
2
3
4
5
6
7
8
9
示例 1:

输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:

输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
阅读更多...

分布式事务

分布式事务

前言

  • 事务想必大家并不陌生,至于什么是 ACID,也是老生常谈了。
  • 还是得先说说 ACID,然后再来介绍下什么是分布式事务和常见的分布式事务包括 2PC、3PC、TCC、本地消息表、消息事务、最大努力通知。
阅读更多...

排序-01-堆排序

排序-01-堆排序

前言

  • 堆排序是利用这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。

1. 堆

  • 堆是具有如下性质的完全二叉树
    • 每个节点的值都大于或者等于其左右孩子节点的值,成为大顶堆
    • 每个节点的值都小于或者等于其左右孩子节点的值,成为小顶堆

mark

同时,将堆中节点按照层级进行编号,将这种逻辑结构映射到数组中就是如下的例子

mark

该数组从逻辑上讲就是一个堆结构,我们用简单的公式来描述一下堆的定义就是:

大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]

小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]

ok,了解了这些定义。接下来,我们来看看堆排序的基本思想及基本步骤:

阅读更多...

Leetcode-345-反转字符串中的元音字母

Leecode-345-反转字符串中的元音字母

思路:双指针

题目描述:

将元音字母进行交换

1
Given s = "leetcode", return "leotcede".

Solution:双指针

  • 本题为基础双指针法交换前后元音元素;

  • 一般遇见字符串问题,能转成字符数组就尽量转(方便);

  • 转换成数组后,分别定义前后两个索引指针用 while 依次遍历数组;

  • 定义 isVowel() 方法将非元音元素返回给判断处,然后移动指针直到符合元音的位置,然后 tmp 进行交换即可;

  • 最后扫描完数组后,一定要在返回的时候再转成字符串 String 输出。

阅读更多...

Mysql-11-慢查询优化

Mysql-11-慢查询优化

注意sql查询慢的原因都是:引起filesort

1. 分析慢查询日志

  • 直接分析mysql慢查询日志 ,利用explain关键字可以模拟优化器执行SQL查询语句,来分析sql慢查询语句

    例如:执行EXPLAIN SELECT * FROM res_user ORDER BYmodifiedtime LIMIT 0,1000

1
2
3
4
5
6
7
8
9
10
11
得到如下结果: 显示结果分析:  

table | type | possible_keys | key |key_len | ref | rows | Extra EXPLAIN列的解释:

table 显示这一行的数据是关于哪张表的

type 这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL

rows 显示需要扫描行数

key 使用的索引

以下通过explain显示出mysql执行的字段内容:

  • id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符.
  • select_type: SELECT 查询的类型.
  • table: 查询的是哪个表
  • partitions: 匹配的分区
  • type: join 类型
  • possible_keys: 此次查询中可能选用的索引
  • key: 此次查询中确切使用到的索引.
  • ref: 哪个字段或常数与 key 一起被使用
  • rows: 显示此查询一共扫描了多少行. 这个是一个估计值.
  • filtered: 表示此查询条件所过滤的数据的百分比
  • extra: 额外的信息

注意 : 可以使用explain命令加在要分析的sql语句前面,在执行结果中查看key这一列的值,如果为NULL,说明没有使用索引。

阅读更多...

Java-基础-类初始化造成的死锁

Java-基础-类初始化造成的死锁

前言

关于类初始化有几个关键特性:

  • 类初始化的过程其实就是执行类构造器方法()的过程;
  • 在子类初始化完成时,虚拟机会保证其父类有初始化完成;
  • 多线程环境下,虚拟机执行()方法会自动加锁;

在java中,死锁肯定是在多线程环境下产生的。多个线程同时需要互相持有的某个资源,自己的资源无法释放,别人的资源又无法得到,造成循环依赖,进而一直阻塞在那里,这样就形成死锁了。

阅读更多...
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信