美文网首页
线程核心之同步,死锁,交互

线程核心之同步,死锁,交互

作者: Candy_糖果 | 来源:发表于2018-04-10 16:23 被阅读0次

同步


多个线程同时修改一个数据时(也叫并发操作),容易导致同步问题(同时修改),产生脏数据

解决方法

在多个线程同时修改的数据上加锁,当一个线程修改时,另外的线程排队等待,直到释放锁后其它线程才能占用,避免同时修改问题

MyStack实例代码

  1. syschronized实现代码

  2. Lock实现代码

死锁


  1. 线程1占用A,接着请求占用B
  2. 线程2占用B,接着请求占用A
  3. 就这样,两个线程占用各自的,请求对方的,就形成死锁
来自 how2j.cn

解决方法

  1. synchronized必须通过谨慎和良好的设计,才能减少死锁的发生。
  2. Lock可以选择性的获取锁,trylock()会在指定时间范围内试图占用,没有占用成功会继续往下走
// Lock 核心代码
boolean locked = lock.tryLock(1,TimeUnit.SECONDS);
if(locked){
    // 申请占用成功操作
}else{
    // 没有占用成功操作
}

交互


所谓交互,就是线程之间的交互通知

  1. syschronized 交互:wait(), notify(), notifyAll()
  2. Lock 交互:await(), signal(), signalAll()

生产者消费者问题

生产者消费者问题是一个非常典型性的线程交互的问题。它们公有一个缓冲区,该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

实现方法

  1. 使用栈来存放数据
    1. 把栈改造为支持线程安全
    2. 把栈的边界操作进行处理,当栈里的数据是0的时候,访问pull的线程就会等待。 当栈里的数据时200的时候,访问push的线程就会等待
  2. 提供一个生产者(Producer)线程类,生产随机大写字符压入到堆栈
  3. 提供一个消费者(Consumer)线程类,从堆栈中弹出字符并打印到控制台
  4. 提供一个测试类,使两个生产者和三个消费者线程同时运行

代码

  1. syschronized实现代码

  2. Lock实现代码

线程池


使用原因

每个线程的启动和结束是比较消耗时间和占用内存的(每个线程需要1MB内存,线程开的越多,消耗的内存越大,最后会死机),为了解决这个问题,所以引入线程池的概念

设计原理

线程池的思路与消费者生产者模型很相似,主要两函数,任务添加 和 运行任务

  1. 准备一个任务容器
  2. 一次性启动10个(根据需要)消费线程
  3. 刚开始任务容器是空的,所以线程都是 wait()
  4. 直到外部环境往任务容器里放进“任务”,就会有消费线程被唤醒notify()
来自 how2j.cn

实例代码

自定义线程池代码

区别

生产者消费者和线程池实现的区别在于:前一个是手动消费,后一个是自动消费

参考

http://how2j.cn/k/thread/thread-start/353.html

相关文章

  • 线程核心之同步,死锁,交互

    同步 多个线程同时修改一个数据时(也叫并发操作),容易导致同步问题(同时修改),产生脏数据 解决方法 在多个线程同...

  • 并发 :线程间同步、锁、可重入锁及互斥锁

    线程间同步 线程间同步涉及线程互斥锁; 锁(Lock)容易导致死锁,可重入锁(RLock)则不会导致死锁,但每次 ...

  • GCD分析(中)

    同步函数死锁 死锁现象 主线程因为同步函数的原因等着先执⾏任务 主队列等着主线程的任务执⾏完毕再执⾏⾃⼰的任务 主...

  • Synchronized关键字详解2(对非object持锁)

    4.死锁:同步方法容易造成死锁。Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁...

  • 关于主线程执行同步任务造成死锁的思考

    经典问题重现 bug 粘贴主线程+同步造成死锁 要想明白,为什么造成死锁,首先要搞懂主线程是干嘛的 主线程程序运行...

  • iOS 多线程面试题(死锁)

    死锁 死锁就是队列引起的循环等待 1、一个比较常见的死锁例子:主队列同步 在主线程中运用主队列同步,也就是把任务放...

  • GCD

    1、同步串行队列 2、同步并行队列 3、异步串行队列 4、异步并行队列 5、死锁 主线程中创建同步串行队列 主线程...

  • 18 多线程死锁

    多线程死锁产生的原因:在同步中嵌套同步,会出现死锁的现象。 查找到当前JVM环境变量C:\Program File...

  • Java(多线程)

    创建线程 Runnable接口实现 匿名内部类实现 synchronized Lock 线程的死锁原理:多个同步 ...

  • GCD 使用过程中的出现的死锁问题

    死锁 1、 主队列在主线程同步执行 下列代码写在 viewDidLoad 中: 上面死锁的写法是: ** 主队列...

网友评论

      本文标题:线程核心之同步,死锁,交互

      本文链接:https://www.haomeiwen.com/subject/uxjnhftx.html