JAVA核心技术总结(十四章)多线程

  1. 例子
class ThreadTask implements Runnable //在1.5以后加入了callable接口
{
    public void run()
    {    
        //.....
    }
}
ThreadTask task = new ThreadTask();
Thread t = new Thread(task);
t.start();
  1. 锁对象
    假定第一个线程调用transfer方法,在执行结束前被剥夺了运行权。假定第二个线程也调用transfer,由于第二个线程不能获得锁,将在调用lock方法时被阻塞,必须等第一个线程unlock后才能被激活。
    每个Bank对象都有自己的ReentrantLock,如果两个线程访问同一个Bank对象,锁以串行的方式提供服务,但是如果每个线程访问不同的Bank对象将得到不同的锁对象,不会发生阻塞
public class Bank
    Lock bankLock = new ReentrantLock();//定义锁
    Condition sufficientFunds = bankLock.newCondition(); //定义条件
    public void transfer(int from, int to, int amount)
    {
            bankLock.lock(); //加锁
            try{
            while(! (ok to proceed)) //条件变量不满足
                Con.await();  //该线程被阻塞并且放弃了锁,等待其他线程通过signalAll来激活自己重新进入该while循环继续执行
                //do something
                Con.signalAll(); //当该线程做了某些事情后,其他线程的条件变量可能被满足,所以通过signalAll来激活等待该条件的所有线程,让它们继续尝试运行
            }
            finally{
                bankLock.unlock();//解锁
            }
    }
}
  1. synchronized关键字用于保护整个方法(能用synchronized就不要自己使用Lock/Condition)
public synchronized void transfer(int from, int to, int amount) throws InterruptedException
{
    while(!(ok to proceed))
        wait();  //同条件变量的wait
        //do something
        notifyAll();  //同条件变量的signalAall
    }
}
  1. volatile
    声明为volatile的变量每次使用时都要重新从内存中读取(因为其有可能被其他线程改变,所以不能信任预取在寄存器中的值)

  2. 线程局部变量
    有时为了避免共享变量,使用ThreadLocal辅助类为各个线程提供各自的实例。

  3. 读写锁

private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private Lock readLock = rwl.readLock()
private Lock writeLock = rwl.writeLock()

对所有读方法加锁

void read()
{
    readLock.lock();
    //do something
    readLock.unlock();
}

对所有写方法加锁

void write()
{
    writeLock.lock();
    //do something
    writeLock.unlock();
}
  1. 线程中断
    首先来看Thread类三个和中断有关的方法:
    ==interrupt方法不会真的终止线程运行,而只是设定中断的标志位,然后由线程本身决定如何处理这个中断==
    理解Java线程的中断
    《Java并发编程》之线程中断与终止线程运行
    每个线程都有一个与之相关联的 Boolean 属性,用于表示线程的中断状态(interrupted status)。中断状态初始时为 false;当另一个线程通过调用 Thread.interrupt() 中断一个线程时,会出现以下两种情况之一。
  • 如果那个线程在执行一个低级可中断阻塞方法,例如 Thread.sleep()、 Thread.join() 或 Object.wait(),那么这些方法将取消阻塞并抛出 InterruptedException(注意是线程内部的这些方法抛出的)。
  • 否则, interrupt() 只是设置线程的中断状态。 在被中断线程中运行的代码以后可以轮询中断状态,看看它是否被请求停止正在做的事情。中断状态可以通过 Thread.isInterrupted() 来读取,并且可以通过一个名为 Thread.interrupted() 的操作读取和清除。
    中断是一种协作机制。当一个线程中断另一个线程时,被中断的线程不一定要立即停止正在做的事情。相反,中断是礼貌地请求另一个线程在它愿意并且方便的时候停止它正在做的事情。有些方法,例如 Thread.sleep(),很认真地对待这样的请求,但每个方法不是一定要对中断作出响应。对于中断请求,不阻塞但是仍然要花较长时间执行的方法可以轮询中断状态,并在被中断的时候提前返回。 您可以随意忽略中断请求,但是这样做的话会影响响应。
    中断的协作特性所带来的一个好处是,它为安全地构造可取消活动提供更大的灵活性。我们很少希望一个活动立即停止;如果活动在正在进行更新的时候被取消,那么程序数据结构可能处于不一致状态。中断允许一个可取消活动来清理正在进行的工作,恢复不变量,通知其他活动它要被取消,然后才终止。
    参考资料
public class Thread {
    // 发出一个中断请求,把标志位设定为中断状态,不会终止线程运行。
    // 其他线程试图调用该方法,会检测是否有权限中断该线程(正常情况
    // 下不会存在权限问题,这里可以忽略)
    public void interrupt() { ... }

    // 检测标志位是否为中断的状态
    public boolean isInterrupted() { ... }

    // 清除当前线程的标志位的中断状态,返回是否为中断状态
    public static boolean interrupted() { ... }
}
  1. java编程语言中没有任何东西可以避免或打破死锁现象,必须由程序员仔细设计程序确保不会出现死锁。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容