高级知识点:多线程,资源管理【笔记】

高级知识点:多线程,资源管理【笔记】

多线程

线程安全性对于多线程来说是至关重要的,因此我们要加锁来加强安全性

死锁分析

在任何地方都可以线程切换,甚至在一句语句中间也可以

要尽力的设想对自己不利的情况

不利的情况:

死锁的条件

第一就是互斥等待

第二个就是hold and wait,拿着一个锁去等待另一个锁

第三个是循环等待,拿着a的等b,拿着b的等a

第四个就是无法剥夺的等待

这四个条件必须同时完成才可以形成死锁,不然都可能没法组成死锁,所以要破除死锁的话,就从其中找方法

死锁防止

破除互斥等待,这种一般无法破除

破除hold and wait,可以一次性获取全部资源

破除循环等待,可以按照顺序获取资源

破除无法剥夺的等待,可以加入超时机制

线程池

创建线程开销大,为了防止这些开销,就出现了线程池,线程池就是预先建立好的一些线程,等任务派发,有了任务就去

线程池的实现很多时候都是编程语言中就有各自的实现

线程池的参数

corepoolsize:线程池中初始线程数量,可能处于等待状态

maximumpoolsize:线程池中最大允许的线程数量

keepalivetime:超出corepoolsize部分线程,如果等待这些,那么等待时间将被回收

线程池的java executor framework的演示

具体代码如下:

package interview.adv;

import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import interview.designpattern.task.CodingTask;

public class ExecutorTester {

  public static void main(String[] args)
      throws InterruptedException, ExecutionException {
    ExecutorService executor = Executors.newFixedThreadPool(3);

    List<Future<?>> taskResults = new LinkedList<>();
    for (int i = 0; i < 10; i++) {
      taskResults.add(executor.submit(new CodingTask(i)));
    }
    System.out.println("10 tasks dispatched successfully.");

    for (Future<?> taskResult : taskResults) {
      taskResult.get();
    }

    System.out.println("All tasks finished.");
    executor.shutdown();
  }
}

资源管理

java垃圾回收

不会被引用的对象会被回收掉

垃圾回收包括minor GC 和 full GC

垃圾回收的时候所有的运行都会暂停

java资源管理(输入输出)

内存会被回收,资源不会被释放,比如databaseconnection需要databaseconnection.close()来释放,操作大概

Java1.6的时候

Java1.7以后

c++的资源管理

c++没有final,没有try with resource,但是有析构函数

大致做法:


大部分的语言都有自己的垃圾回收机制

感谢观看,文笔有限,博客不出彩,还请多多见谅
原文地址:https://www.cnblogs.com/jokingremarks/p/14474124.html