码迷,mamicode.com
首页 > 编程语言 > 详细

java多线程学习总结

时间:2015-03-08 21:42:04      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

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

具体理解:同一时间运行多个线程,多个线程对同一数据资源进行处理,可能会造成数据的失真性,具体例子参考:<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() // 得到一个写锁,排斥所有其他的读操作和写操作

二.阻塞队列:

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

三.线程的安全集合

四.执行器:

  线程池

五.同步器:


java多线程学习总结

标签:

原文地址:http://my.oschina.net/liuchunhui/blog/384055

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!