今天学到了

在身边的个人空间


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

Java并发理论基础

发表于 2020-05-18 | 分类于 人类的本质是复读机 | 阅读次数:

并发编程的第一原则:不要写并发程序

多线程并发问题

  • 硬件的核心矛盾:CPU 与内存、I/O 的速度差异
  • 三个核心问题:分工、同步、互斥
    • 分工:如何高效地拆解任务并分配给线程(Fork/Join 框架就是一种分工模式)
    • 同步:线程之间如何协作(CountDownLatch 就是一种典型的同步方式)
    • 互斥:保证同一时刻只允许一个线程访问共享资源(可重入锁就是一种互斥手段)
  • 核心矛盾:CPU、内存、I/O 设备,这三者的速度差异
  • 并发编程Bug的源头:
    • 缓存导致的可见性问题(volatile解决)
    • 线程切换带来的原子性问题(锁解决)
    • 编译优化带来的有序性问题(happens-before解决)

Java内存模型

  • Java 内存模型规范了 JVM 如何提供按需禁用缓存和编译优化的方法。具体来说,这些方法包括 volatile、synchronized 和 final 三个关键字,以及八项 Happens-Before 规则。
  • volatile:最原始的意义就是禁用 CPU 缓存。
  • final:这个变量生而不变,可以可劲儿优化。
  • happens-before:前面一个操作的结果对后续操作是可见的。
    • 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作 happens-before 书写在后面的操作。
    • 锁定规则:一个unLock操作 happens-before 后面对同一个锁的lock操作。
    • volatile变量规则:对一个变量的写操作 happens-before 后面对这个变量的读操作。
    • 传递规则:如果操作A happens-before 操作B,而操作B又 happens-before 操作C,则可以得出操作A happens-before 操作C。
    • 线程启动规则:Thread对象的start()方法 happens-before 此线程的每个一个动作。
    • 线程中断规则:对线程interrupt()方法的调用 happens-before 被中断线程的代码检测到中断事件的发生。
    • 线程终结规则:线程中所有的操作都 happens-before 线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行。
    • 对象终结规则:一个对象的初始化完成 happens-before 他的finalize()方法的开始
阅读全文 »

连我都能理解的算法题

发表于 2020-05-16 | 分类于 人类的本质是复读机 | 阅读次数:

无参数交换a,b

1
2
3
4
5
public void swap(int a, int b) {
a = a + b;
b = a - b;
a = a - b;
}

设计一个公平的洗牌算法

公平是指,每一个元素都能独立等概率的出现在每一个位置。或者反过来,每一个位置都能独立等概率的放置每个元素。

1
2
3
4
5
6
7
8
public void knuthDurstenfeldShuffle(int arr) {  
for (int i = arr.length - 1;i > 0; i--) {
// 随机生成[0, i]间的正整数
int j = random(i);
// 交换i和j的位置的元素
swap(arr[i], arr[j]);
}
}

应用:扫雷开局时随机生成雷的位置

来源

石子游戏

有偶数堆的石子,每堆的石子个数可能不同,但石子总数是奇数个。现在两个人轮流选石子堆,规则是每次只能选开头和末尾中的一堆,最终获得石子总数多的人获胜。若某人先选,两个人都会一直做最优选择,最终那个人是否能获胜?

1
2
3
public boolean stoneGame(int[] piles) {
return true;
}

来源

IDEA常见问题解决方法

发表于 2020-05-14 | 分类于 那些古怪又令人忧心的问题 | 阅读次数:

plugins 搜索不出来

现象描述:

进入 plugin 的 Marketplace 无法所搜出任何插件

image

问题原因:

可能就是网络不好吧…

解决方案:

进入Appearance & Behavior -> System Settings -> Http Proxy 勾选上 Auto-detect proxy settings 和 Automatic proxy configuration URL即可(有人说后面还要写上 http://127.0.0.1:1080 或者 https://plugins.jetbrains.com,我自己试是什么都没写就ok了)

image

然后,重启试试 :)

Java 中的 return 与 finally

发表于 2019-09-22 | 分类于 如何精致地拧螺丝 | 阅读次数:

这周出去面试,笔试题中有一道涉及 return 和 finally 的题,当时只依稀记得上课时老师讲的 finally 会在 return 前执行,但是如何执行的没有仔细研究过,故写篇文章好好梳理一下。

此文章只对代码和运行结果做合理猜测与总结,具体运行原理可看参考资料部分,因为涉及到JVM的堆栈之类的,这部分我还不太熟悉,因此此文章中不会对此过多阐述。

阅读全文 »

Windows下安装Redis

发表于 2019-09-16 | 分类于 人类的本质是复读机 | 阅读次数:

继上次Windows下安装MySQL后,今天安装Redis发现也复杂许多,github上有几个仓库似乎提供了windows一键安装版,但是都到2016年就不更新了……所以Macbook真的好使 o(﹏)o

由于Redis本来就是不支持Windows的,为了安装Redis我们首先需要安装另一个工具:cygwin。这个工具能帮助我们在Windows上运行类UNIX模拟环境。

本文安装环境:Windows10 + redis-5.0.5 + cygwin-x86_64

阅读全文 »

对NumPy中transpose方法的理解

发表于 2019-09-10 | 分类于 人类的本质是复读机 | 阅读次数:

NumPy中有个方法叫做transport,用于对数组进行转置或者说轴对换。

通常来说,一维数组不需要转置,因为它只有一个轴。

二维数组因为只有两个轴,它的转置也很简单,直接两个轴对调,在NumPy中arr.T 就能得到,结果的规律一眼就能看出。

1
2
3
4
5
6
7
8
9
10
11
[In]  arr2d = np.arange(15).reshape(3, 5)
arr2d
[out] array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
[In] arr2d.T
[Out] array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])

而三维及以上的高维数组,想要进行转置就只能通过transport方法指定轴进行置换。

阅读全文 »

后端参数统一验证

发表于 2019-08-04 | 分类于 人类的本质是复读机 | 阅读次数:

平时大家写后端接口,为了保证接口安全,都会加一些入参校验,一般都是使用@Valid或@Validated做一些统一简单校验,复杂一点的还是会放在代码里来写,其实这种注解校验也支持一些复杂校验,这篇文章就由简到难地讲述一下注解校验到底能支持到什么程度。

阅读全文 »

Windows下安装MySQL

发表于 2019-07-23 | 分类于 人类的本质是复读机 | 阅读次数:

今天给电脑安装个MySQL 5.7.27,以前一直下一步的安装包不见了,只找到了bin包安装的那种,看着有点懵…虽然搜索一下都能找到解决方法,还是记录一下。本次安装为windows 10 + MySQL 5.7.27-win64

阅读全文 »

编程小技巧(4):简短SQL三则

发表于 2019-07-22 | 分类于 这就很有灵性了 | 阅读次数:

周末看了看LeetCode上的数据库题目,有些平常基本没用到,但是很基础的SQL,确实有些生疏,在此记录一下。

1. 添加行号

原题链接

1
2
3
4
5
SELECT
a.score,
@rowNum := @rowNum + 1 AS rank
FROM scores a,
(SELECT @rowNum := 0) b
2. 查询连续出现n次的数据

原题链接

1
2
3
4
5
6
7
8
9
10
11
SELECT 
DISTINCT a.num
FROM (
SELECT
t.num,
@count := IF (@pre = t.num, @count + 1, 1) AS count,
@pre := t.num AS pre
FROM logs t,
(SELECT @pre := NULL, @count := 0) b
) a
WHERE a.count >= 3;
3. 删除重复数据,只保留Id最小的那条

原题链接

1
2
3
4
5
DELETE FROM person WHERE id NOT IN ( 
SELECT t.id FROM (
SELECT MIN(id) AS id FROM person GROUP BY email
) t
);

常用词组记录

发表于 2019-07-02 | 分类于 假如你是李华 | 阅读次数:

MySQL相关

词组 释义 备注 缩写
atomicity 原子性 事务特性
consistency 一致性 事务特性
isolation 隔离性 事务特性
durability 持久性 事务特性
dirty read 脏读 事务问题
non-repeatable read 不可重复读 事务问题
phantom read 幻读 事务问题
read uncommitted 读未提交 事物隔离级别
read committed 读已提交 事物隔离级别 RC
repeatable read 可重复读 事物隔离级别 RR
serializable 串行化 事物隔离级别
multi-version concurrency control 多版本并发控制 MVCC
consistent read view 一致性读视图
consistent read 一致性读
current read 当前读
write-ahead logging 先写日志,再写磁盘
index condition pushdown 索引下推
metadata lock MDL
阅读全文 »
123<i class="fa fa-angle-right"></i>

27 日志
6 分类
20 标签
GitHub E-Mail
友情链接
  • 朱宏超 | Telami
© 2018 — 2022 在身边
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4
津ICP备18009161号-1