![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java多线程
文章平均质量分 83
rancho945
追求卓越,成功就会出其不意找上门。
展开
-
Java并发编程系列(二)----synchronized锁详解
前面我们分析了volatile关键字,我们知道volatile关键字是无法保证线程安全的。那么Java的线程安全主要由内置的synchronized关键字和Locks包下的类来保证。关于synchronized,有两种同步方式,一种是同步方法,另外一种是同步代码块,关于什么是同步代码块,什么是同步方法就不细讲了,这里主要讲讲Java的内置锁。看一段代码package com.rancho945.co原创 2017-02-06 00:34:17 · 451 阅读 · 1 评论 -
Java并发编程系列(三)----Lock
前面我们讲到synchronized,既然synchronized已经能够保证线程安全,那么为什么还需要Lock呢? 我们从synchronized的缺陷讲起。synchronized 的缺陷只有线程执行完锁保护的代码或者发生异常或者锁的持有线程主动调用了wait才能释放锁,synchronized锁等待过程没有一种响应中断机制(注意和Thread的interrupt中断机制的区别),也没有等待原创 2017-02-06 23:24:10 · 276 阅读 · 0 评论 -
Java并发编程系列(一)----深入剖析volatile关键字
从内存模型讲起由于CPU的高速运算,主内存的频率远远达不到要求,因此需要将用到的数据进行缓存,比如一个很简单的操作: i=i+1;这样CPU首先会从主内存中将i的值读到CPU的高速缓存(工作内存)中,然后进行加1操作,完事之后将新的值写入到主内存中。有人会想,MDZZ,这有什么好说的,看似简单的一小步,确是并发编程爬坑的一大步。假如i的值为0,两个线程进行操作,最终的结果一定是2吗?想象一下这原创 2017-02-03 20:56:21 · 377 阅读 · 0 评论 -
Java并发编程系列(四)----CAS与原子类
为了实现线程安全,我们前面都是用锁的方式来保证原子性,那么有不加锁能不能实现线程安全呢?这要从乐观锁和悲观锁说起。 1. 悲观锁。所谓的悲观锁,就是对资源的访问,默认情况下是认为会存在资源抢占,所以每次都要加锁,只能有一个线程执行。乐观锁。另外一种锁的策略,默认资源不存在竞争,多个线程可以同时操作,在最后进行更新数据的时候,查看该资源是否被其他线程修改过,没有则执行更新,有则放弃本次操作。CA原创 2017-02-08 20:16:03 · 1185 阅读 · 0 评论 -
Java并发编程系列(五)----ReentrantLock源码解析
ReentrantLock有三个内部类Sync、FairSync、NonfairSync,主要类图关系用UML表示为: 首先看看成员变量 private final Sync sync;该变量表示锁的类型,是公平锁还是非公平锁,具体要看构造函数。再看看构造函数:public ReentrantLock() { sync = new NonfairSync();}public Reen原创 2017-02-10 00:11:49 · 520 阅读 · 0 评论 -
Java并发编程系列(六)---- ThreadLocal使用及源码分析
ThreadLocal成为线程本地变量,从名字大概可以猜出是和线程本地变量有关的,提供的方法主要有这么几个//获取值public T get() { }//设置值public void set(T value) { }//移除public void remove() { }//初始化值protected T initialValue() { }ThreadLocal的使用我们看看Thr原创 2017-02-11 00:56:52 · 319 阅读 · 0 评论 -
Java并发编程系列(七)---- 线程池的使用
如果用new Thread().start的方式使用线程,当线程执行完毕后会销毁,如果频繁地创建和销毁线程,对系统的消耗将会非常大。那么如果线程执行完任务后还可以重新使用,那么就可以提高性能。线程JDK里面线程池主要使用的是ThreadPoolExecutor,现在来初步感受一下线程池的使用:package com.rancho945.concurrent;import java.util.conc原创 2017-02-12 21:25:46 · 384 阅读 · 0 评论