多线程并发编程

Wait/NotifyAll标准使用

等待方线程
1.获取对象锁
2.判断条件
代码写法
sync(对象){
    while(条件){
        wait();//线程在此处等待,唤醒后继续执行后续方法doFun();
        doFun();//唤醒的后续操作
    }
}

修改方线程
1.获取对象锁
2.修改判断条件
代码写法
sync(对象){
    //修改条件后
    notifyAll();//通知所以线程继续执行
}

锁的特性/分类

  1. 公平、非公平锁
  2. 可重入锁
  3. 排他、非排他锁

Synchronized 内部锁(虚拟机实现)

  1. 锁的是对象实例
  2. 可重入锁
  3. 非公平锁

Lock:显示锁(代码实现)

  1. ReentrantLock:普通可重入锁(支出公平和非公平锁)
Lock lock = new ReentrantLock(true/false)

1.一定要用try/finally包裹

public void work(){
    lock.lock();
    try{
        //do work
    }finally{
        lock.unlock();
    }
}
  1. ReadWriteLock:读写锁 频率->读:写=>10:1
1.读非排他锁,写排他锁
ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
Lock readLock = readWriteLock.readLock();//读线程
Lock writeLock = readWriteLock.writeLock();//写线程

2.ReentrantReadWriteLock 高效读,写安全

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.解决信号量丢失和假唤醒 public class MyWaitNotify3{ MonitorObject m...
    Q罗阅读 4,425评论 0 1
  • 1、说说进程、线程、协程之间的区别 简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程...
    FX_SKY阅读 4,572评论 0 2
  • 问:简单谈谈你对多线程并发锁使用时的一些优化经验? 答:首先加锁会带来性能上的损坏,但是加锁本身不会带来多少性能消...
    Little丶Jerry阅读 2,972评论 0 3
  • 还在子夜时分发傻 有什么可以庆祝的 只不过黑头里又添白发 孩子们,盼着长大,蹦蹦哒哒 我个老头咋,期待有神马 日复...
    利君理疗阅读 962评论 0 1
  • 一辆老式自行车停在查理的门前,布德斯按了几声门铃,却不见有人开门,他踢了几下门,嘴里嘟了几声:“死家伙,是聋子,每...
    陈汐年阅读 6,167评论 20 12