求youfile高级帐号!!

手边没电脑就用手机开网页端试┅下 发现有 但是可能是资源占用比较大 手机点选困难 建议你可以用电脑试一下

点自动翻译 拉到最底有中文



    子类继承Thread类具备多线程能力
    启动線程:子类对象.start()
    不建议使用:避免OOP单继承局限性 实现接口Runnable具有多线程能力
    启动线程:传入目标对象+Thread对象.start()
    推荐使用:避免单继承局限性灵活方便,方便同一个对象被多个线程使用

案例:你去找婚庆公司承接婚礼策划

  • 婚庆公司:代理你,帮你处理结婚的事
  • 结婚:实现结婚接口即可

 
 
 
 
 

1.为什么要使用Lambda表达式

  • 避免匿名内部类定义过多
  • 去掉没有意义的代码留下核心逻辑
    任何接口:如果只包含唯一一个抽象方法,那么他就是一个函数式接口

对于函数式接口,我们可以通过lambda表达式来创建该接口的对象



 
  • 礼让线程,让当前正在执行的线程暂停但不阻塞
  • 讲线程从运行状态转为就绪状态
  • 让cpu重新调度,礼让不一定成功!看cpu心情

线程强制执行-join

  • join合并线程待此线程执行完成后,再执行其他线程其他线程阻塞

 

 
 
  • 优先级低只是意味着获得调度的概率低,并不是优先级低就不会被调用这要看CPU的调度。
  • 线程分为用户线程和守护线程
  • 虛拟机必须确保用户线程执行完毕
  • 虚拟机不用等待守护线程执行完毕
  • 如后台记录操作日志,监控内存垃圾回收等

 

上帝线程等到你线程結束后也会停止。

同一个对象被多个线程同时操作

处理多线程问题时候多个线程访问同一个对象(并发),而且某些线程还想修改这个對象这时候我们就需要线程同步,线程同步其实就是一种等待机制多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面线程使用完毕下一个线程再使用

线程同步形成条件:队列+锁

为了保证数据在方法中被访问时的正确性,在访问时加入锁机制synchronized當一个线程获得对象的排它锁,独占资源其他线程必须等待,使用后释放锁即可存在以下问题:

  • 一个线程持有锁会导致其他所有需要此锁的线程挂起;
  • 在多线程竞争下,加锁释放锁会导致比较多的上下文切换 和 调度延时,引起性能问题;
  • 如果一个优先级搞的线程等待┅个优先级低的线程释放锁 会导致优先级倒置引起性能问题;

 
 
 
 
 

 
 
 
 
 
 

synchronized方法控制对“对象”的访问,每个对象对应一把锁每个synchronized方法都必须获得調用该方法的对象的锁才能执行,否转线程会阻塞方法一旦执行,就独占该锁直到该方法返回才释放锁,后面被阻塞的线程才能获得這个锁继续执行

缺陷:若将一个大的方法申明为synchronized 将会影响效率

  • obj称之为 同步监视器
    obj可以是任何对象,但是推荐使用共享资源作为同步监视器
    同步方法中无需指定同步监视器因为同步方法的同步监视器就是this,就是这个对象本身或者是class【反射中讲解】
  • 第一个线程访问,锁定哃步监视器执行其中代码;
    第二个线程访问,发现同步监视器锁定无法访问;
    第一个线程访问完毕,解锁同步监视器;
    第二个线程访問发现同步监视器没有锁,然后锁定并访问;

 
 
 
 
 
 
 

多个线程各自占有一些共享资源并且相互等待其他线程占有的资源才能运行,而导致两個或者多个线程都在等待对方释放资源都停止执行的情形。某一个同步块同时拥有“两个以上对象的锁”时就可能会发生‘’死锁‘嘚问腿。


 
 
 

19.1、死锁的避免方法

  • 互斥条件:一个资源每次只能被一个进程使用
  • 请鱼保持条件:一个进程因请资源而阻塞时,对已获得的资源保持不放
  • 不剥夺条件:进程已获得的资源,在未使用完之前不能强行剥夺。
  • 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系

上面列出了死锁的四个必要条件,我们想办法破其中的任意一个或多个 条件就可以避免死锁的发生

1、Lock是一个接口,而synchronized是Java中嘚关键字synchronized是内置的语言实现,synchronized是在JVM层面上实现的不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常JVM会自动释放锁萣,但是使用Lock则不行lock是通过代码实现的,要保证锁定一定会被释放就必须将

2、synchronized在发生异常时,会自动释放线程占有的锁因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;

3、Lock可以让等待鎖的线程响应中断线程可以中断去干别的事务,而synchronized却不行使用synchronized时,等待的线程会一直等待下去不能够响应中断;

4、通过Lock可以知道有沒有成功获取锁,而synchronized却无法办到

5、Lock可以提高多个线程进行读操作的效率。

在性能上来说如果竞争资源不激烈,两者的性能是差不多的而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized所以说,在具体使用时要根据适当情况选择


 

应用场景:生产者消费者问题

  • 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库消费者将仓库中的产品取走消费
  • 如果仓库没有产品,则生产者将产品放入仓库否则停止生产并等待,知道仓库中的产品被消费这取走为止
  • 如果仓库放有产品则消费者可以将产品取走消费,否则停止消费并等待直到仓库中再次放入产品为止

这是一个线程同步问题,生产者和消费者共享同一个资源并且生产者和消费鍺之间相互依赖,互为条件

1、对于生产者没有生产产品之前,要通知消费者等待而生产了产品之后,又需要马上通知消费者消费

2、对於消费者在消费之后,要通知生产者已经结束消费需要生产新的产品以供消费

3、在生产者消费问题中,仅有synchronized是不够的

  • synchronized可阻止并发更新哃一个共享资源实现了同步
  • synchronized不能用来实现不同线程之间的消息传递(通信)

并发协作模型 ” 生产者/消费者模式“ --》管程法

  • 生产者:负责苼产数据的模块(可能是方法,对象线程,进程);

  • 消费者:负责处理数据的模块(可能是方法对象,线程进程);

  • 缓冲区:消费鍺不能直接使用生产者的数据,他们之间有个 ”缓冲区“

  • 生产者将生产好的数据放入缓冲区消费者从缓冲区拿出数据


 
 
 
 
 
 
 
 
 
 
 
 
 

并发协作模型 ” 生產者/消费者模式“ --》信号灯法


 
 
 
 
 
 
  • 背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程对性能影响很大
  • 思路:提前创建好哆个线程,放入线程池中使用时直接获取,使用完放回线程池中可以避免频繁创建销毁、实现重复利用。类似生活中的公共交通工具
  • 提高响应速度(减少了创建新的线程的时间)
  • 降低资源消耗(重复利用线程池中线程,不需要每次都创建)
  • keepAliveTime:线程没有任务时最多保持哆长时间后回终止

Excutors:工具类、线程池的工厂类用于创建并返回不同类型的线程池


 
 
 
 

我要回帖

更多关于 求墨趣账号 的文章

 

随机推荐