摘要:
先上一个场景:假如你突然想做饭,但是没有厨具,也没有食材。网上购买厨具比较方便,食材去超市买更放心。
实现分析:在快递员送厨具的期间,我们肯定不会闲着,可以去超市买食材。所以,在主线程里面另起一个子线程去网购厨具。
但是,子线程执行的结果是要返回厨具的,而run方法是没有返回值的。所以,这才是难点,需要好好考... 阅读原文
2020-01-29 09:39:56 阅读(2409) 评论(0)
摘要:
创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。
这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。
如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。
而自从Java 1.5开始,就提供了Calla... 阅读原文
2020-01-29 08:26:02 阅读(2348) 评论(0)
摘要:
一.利用多线程
直接new线程
Thread t = new Thread(){
@Override
public void run() {
longTimeMethod();
}
};
使用线程池
private ExecutorService executor = Executors.... 阅读原文
2020-01-29 07:56:01 阅读(2515) 评论(0)
摘要:
问题:在多线程环境下,如何防止自己的变量被其它线程篡改
答案:ThreadLocal.
ThreadLocal 不是用来解决共享对象的多线程访问的竞争问题的,因为ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。当线程终止后,这些值会作为垃圾回收。... 阅读原文
2020-01-29 07:09:08 阅读(2421) 评论(0)
摘要:
ReentrantLock实现了标准的互斥锁:一次最多只有一个线程能够持有相同ReentrantLock。但是互斥通常做为保护数据一致性的很强的加锁约束,因此,过分的限制了并发性。互斥是保守的加锁策略,避免了
“写/写”和“写/读"的重读,但是同样避开了"读/读"的重叠。在很多情况下,数据结构是”频繁被读取“... 阅读原文
2020-01-29 06:58:03 阅读(2379) 评论(0)
摘要:
一、锁优化的思路和方法
锁优化是指:在多线程的并发中当用到锁时,尽可能让性能有所提高。一般并发中用到锁,就是阻塞的并发,前面讲到一般并发级别分为阻塞的和非阻塞的(非阻塞的包含:无障碍的,无等待的,无锁的等等),一旦用到锁,就是阻塞的,也就是一般最糟糕的并发,因此锁优化就是在堵塞的情况下去提高性能;所以所锁的优... 阅读原文
2020-01-29 06:00:09 阅读(2354) 评论(0)
摘要:
目录
1. ReentrantLock简介
2.ReentrantLock和synchronized的比较
2.1 相同点
2.2不同点
3.ReentrantLock相比synchronized的额外功能
3.1 ReentrantLock可以实现公平锁。
3.2 .ReentrantLock... 阅读原文
2020-01-29 00:54:02 阅读(2440) 评论(0)
摘要:
通过分析这两个用法的分析,我们可以理解java中锁的概念。一个是实例锁(锁在某一个实例对象上,如果该类是单例,那么该锁也具有全局锁的概念),一个是全局锁(该锁针对的是类,无论实例多少个对象,那么线程都共享该锁)。实例锁对应的就是synchronized关键字,而类锁(全局锁)对应的就是static synch... 阅读原文
2020-01-28 23:12:01 阅读(2413) 评论(0)
摘要:
一、简介
volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile 变... 阅读原文
2020-01-28 22:08:02 阅读(2896) 评论(0)
摘要:
按位与运算符(&)
参加运算的两个数,按二进制位进行“与”运算。
运算规则:只有两个数的二进制同时为1,结果才为1,否则为0。(负数按补码形式参加按位与运算)
即 0 & 0= 0 ,0 & 1= 0,1 & 0= 0, 1 & 1= 1。
例:3 &5 ... 阅读原文
2020-01-28 20:17:01 阅读(2338) 评论(0)