文档章节

java多线程学习总结

刘春辉
 刘春辉
发布于 2015/03/08 21:06
字数 1018
阅读 313
收藏 15

什么是线程:一个程序执行多个任务,每个人任务称为一个线程.多线程程序是可以同时运行多个一个以上的线程的程序.

具体理解:同一时间运行多个线程,多个线程对同一数据资源进行处理,可能会造成数据的失真性,具体例子参考:<java核心技术.卷一>P640页银行转钱问题.因为对线程的管理不当,造成数据的错误.所以出现了一系列操作管理线程的技巧.

一.线程同步

1.锁对象

有两种机制防止代码受并发访问的干扰,java提供了synchronized关键字,和java5.0

引入的ReentrantLock类(作用:构建一个可以用来被保护临界区的可重入锁).

ReentrantLock保护代码块的基本结构如下:

private Lock mylock = new ReentrantLock();

mylock.lock();

try {

}finally {

mylock.unlock();

}

把解锁操作放到finally句子里,防止在临界区的代码抛出异常,锁必须被释放,否则,线程永远被阻塞.

或许又想,如果创建多个对象,多个对象得到不同的锁对象,多个线程都不会发生阻塞?

锁是可重入的,因为线程可以重复的获得已经持有的锁.锁保持一个持有计数来跟踪对lock方法的嵌套调用.并且lock()方法的作用是获取这个锁,如果同时被另一个线程拥有则发生阻塞.

2.条件对象:

线程进入临界区,却发现在某一个条件满足后他才能执行.要使用一个条件对象来管理已经获得了一个锁但是却不能做有用工作的线程.

private Lock mylock = new ReentrantLock();

private Condition condition = myLock.newCondition(); // 获得条件对象

说白了就是ReentrantLock只能锁住线程,条件对象可以对线程进行一些操作,如await()将进程放到条件等待集中,signallAll()解除该条件等待集中的所有线程的阻塞状态,signal()从条件等待集中随机选择一个线程,解除阻塞状态.

3.synchronized关键字

同步阻塞:

private Object lock = new Object();  // 通过一个对象锁来实现额外的原子操作

synchronized (lock) {     // 多个线程不能共同访问synchronized块内容,同一时刻只有一个线程能访问

    lock.notifyAll();   // 唤醒其他线程继续竞争synchronized块内容

}

4.volatile

volatile是一个类型修饰符。它是被设计用来修饰被不同线程访问和修改的变量.volatile保证了线程可以正确的读取其他线程的写入的值,可见ref JMM happens-before原则,多个线程可以共同访问这个类型变量的内容.

5.读写锁

java.util.concurrent.Locks定义了两个锁类:ReentrantReadWriteLock和ReentrantLock.

// 构造一个ReentrantReadWriteLock对象
private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
// 抽取读锁和写锁
private Lock readLock = rwl.readLock();
private Lock writeLock = rwl.writeLock();
// 对所有获取方法加读锁:
public double getXXX() {
    readLock.lock();
    try {  }
    finally {    readLock.unLock(); }
}
// 对所有修改方法加写锁:
public double setXXX() {
    writeLock.lock();
    try {  }
    finally {    writeLock.unLock(); }
}

Lock readLock() // 得到一个可以被多个读操作共用的读锁,排斥所有写操作.

Lock writeLock() // 得到一个写锁,排斥所有其他的读操作和写操作

二.阻塞队列:

阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来.

三.线程的安全集合

四.执行器:

  线程池

五.同步器:


© 著作权归作者所有

刘春辉
粉丝 4
博文 18
码字总数 5952
作品 0
淄博
程序员
私信 提问
JAVA基础再回首(三十)——JAVA基础再回首完美结束,感概万千!

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52724939 JAVA基础再回首(三十)——JAVA基础再回首完美结束,感概万千! 经过了几...

Aduroidpc
2016/10/02
0
0
Java面试需要准备哪些多线程并发的技术要点

一、概念 什么是线程 一个线程要执行任务,必须得有线程 一个进程(程序)的所有任务都在线程中执行的 一个线程执行任务是串行的,也就是说一个线程,同一时间内,只能执行一个任务 多线程原理 同一...

码蚁说架构
2018/05/31
0
0
你分得清分布式、高并发与多线程吗?

当提起这三个词的时候,是不是很多人都认为分布式=高并发=多线程? 当面试官问到高并发系统可以采用哪些手段来解决,或者被问到分布式系统如何解决一致性的问题,是不是一脸懵逼? 确实,在一...

宋庆离
01/17
2.2K
0
JVM内存结构 VS Java内存模型 VS Java对象模型

Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模型和...

Java架构
2018/07/11
0
0
Java多线程学习(五)线程间通信知识点补充

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀
2018/04/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot配置文件读取pom文件信息

解决的问题 springboot(当然别的也可以)多环境切换需要该配置文件,打包时不够方便。 解决: 配置文件能读取pom文件中的配置,根据命令选择不同配置注入springboot的配置文件中 pom配置文件...

刘一草
9分钟前
3
0
蓝牙自定开锁时间--Python

from Crypto.Cipher import AESfrom binascii import b2a_hex, a2b_hex###强制输入明文增加到16字节的倍数,在末尾补'\0'def add_to_16(text): text = str(text, 'ISO-8859-1'......

丁典
9分钟前
3
0
好程序员web前端教程分享JS基础知识

  好程序员web前端教程分享JS基础知识,为大家分享一篇关于JS的基础知识。   1、执行环境:有时也叫环境,是JavaScript中最为重要的一个概念,执行环境定义了变量或函数有权访问的其他数...

好程序员官网
12分钟前
1
0
kali和win共享文件夹设置

卸载vmtools > whereis vmware-tools /etc/vmware-tools/ /usr/lib/vmware-tools/> cd /etc> sudo rm -r vmware-tools> cd /usr/lib> sudo rm -r vmware-tools 先添加源 leafpa......

yeahlife
13分钟前
1
0
killall 、kill 、pkill 命令区别

killall 命令Linux系统中的killall命令用于杀死指定名字的进程(kill processes by name)。我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程, 我们还需要在之前使...

突突突酱
21分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部