摘要: 重排序 什么是重排序 编译器和处理器为了提高程序的运行性能,对指令进行重新排序 数据依赖性(as if serial) 虽然重排序能够优化性能,但是前提是必须保证结果正确,那么它是如何在单线程下保证结果正确的呢?是根据诗句的依赖性来做的,数据的依赖性可以分为三类: 写后读 写后读的操作肯定是不能重排 阅读全文
posted @ 2019-12-15 21:38 Jin同学 阅读(383) 评论(0) 推荐(0) 编辑
摘要: 同步容器与并发容器 ​ 对于同步容器,有线程安全跟线程不安全的分别,例如,同属于list的Vector跟ArrayList,其中Vector就是线程安全的,ArrayList是线程不安全的,但是实现了线程安全的列表效率又会很慢,原因是线程安全的列表之所以安全是因为在add等方法上添加了synchro 阅读全文
posted @ 2019-12-15 21:36 Jin同学 阅读(216) 评论(0) 推荐(0) 编辑
摘要: 从前创建线程的弊端 没有返回值 不能捕获异常 现在使用Callable+FutureTask既可以有返回值,也可以捕获异常 当有了返回值后,我们就可以不用一直等着线程的结果,而是可以先干点别的事情,最后凭future获取结果,例如星期六你去蛋糕店做蛋糕,店员给你一张小票,你这时候可以先去看一部电影, 阅读全文
posted @ 2019-12-15 21:31 Jin同学 阅读(652) 评论(0) 推荐(0) 编辑
摘要: join() 线程加塞,它的作用是能够阻塞当前线程,等待执行了join()方法的线程执行完毕,再继续执行当前线程。 join()方法源码 CyclicBarrier 这个类的作用是让一组线程互相等待,直到达到某个公共的点,才能继续往下执行。 Semaphore Semaphore实现的东西很简单,就 阅读全文
posted @ 2019-12-15 21:28 Jin同学 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 介绍 ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 ThreadLocal像是一个map,map的键就是每一个线程,值就是变量副本 使用 上面的代码中,每一个线程的值都是从0开始递增,各个线程之间互不影响。 阅读全文
posted @ 2019-12-15 21:26 Jin同学 阅读(386) 评论(0) 推荐(0) 编辑
摘要: wait()与notify() 首先考虑下面的情景,一个线程必须要等另外一个线程执行完才能继续执行,可以设置一个变量,第二个线程一直监控它,当第一个线程执行完后修改这个变量的值,第二个线程监控到值发生了改变然后继续执行,如下代码 上面的方式通过while循环去阻塞,会非常的耗费资源,那么有没有更简单 阅读全文
posted @ 2019-12-15 21:25 Jin同学 阅读(106) 评论(0) 推荐(0) 编辑
摘要: 线程带来的风险 线程安全性问题 出现安全性问题的需要满足的条件:多线程环境、有共享资源、非原子性操作 活跃性问题 死锁 饥饿 活锁 性能问题 cpu上下文切换会有性能问题(cpu分时间片执行) 锁 自旋锁 自旋其实就是当一个线程获取到锁之后,其他的线程会进行阻塞等待,一直到这个线程释放锁后才能进入 阅读全文
posted @ 2019-12-15 21:19 Jin同学 阅读(765) 评论(0) 推荐(0) 编辑
摘要: 线程的状态以及状态之间的切换 线程从创建到死亡有七个状态,分别是初始状态,准备运行,运行状态,阻塞状态,睡眠状态(超时等待状态),等待状态,死亡状态,关系如图所示: 线程的创建 实现线程的几种方式: 继承Thread类 实现Runnable接口 匿名内部类的方式 带返回值的线程 定时器 线程池实现 阅读全文
posted @ 2019-12-15 21:16 Jin同学 阅读(239) 评论(0) 推荐(0) 编辑
摘要: 原文:https://www.jianshu.com/p/592b631e1ff1 阅读全文
posted @ 2019-03-26 14:34 Jin同学 阅读(1258) 评论(0) 推荐(0) 编辑
摘要: 1. 秘钥生成命令 执行完上述的命令就会在root目录下生成公钥跟私钥文件 /root/.ssh/.id_rsa 私钥 /root/.ssh/.id_rsa.pub 公钥 2. 把公钥copy到要登录的目标机器上 scp命令本地拷贝到远程: scp -rp 要拷贝的本机文件 远程主机名@远程主机ip 阅读全文
posted @ 2018-12-27 18:27 Jin同学 阅读(1816) 评论(0) 推荐(1) 编辑