前台线程和后台线程、线程安全

一、线程分为前台线程和后台线程,下面是关于一些知识要点的总结:

  1)托管线程池中的线程(ThreadPool.QueueUserWorkItem()和Task创建的线程)都是后台线程,通过BeginXXX方法运行的线程都是后台线程;应用程序的主线程main()以及使用Thread构造的线程都默认为前台线程;

  2)在进程中,只要有一个前台线程未退出,进程就不会终止。主线程(main函数)就是一个前台线程。而后台线程不会阻止进程的中止,不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止。所以,jre(java runtime environment)判断程序是否执行结束的标准是:所有的前台线程执行完毕。
  3)一般后台线程用于处理时间较短的任务,如在一个Web服务器中可以利用后台线程来处理客户端发过来的请求信息、JVM的垃圾回收线程也是一个后台线程。而前台线程一般用于处理需要长时间等待的任务,如在Web服务器中的监听客户端请求的程序,或是定时对某些系统资源进行扫描的程序。
  4)不管是前台线程还是后台线程,如果线程内出现了异常,都会导致进程的终止。
  5)可以在任何时候将前台线程修改为后台线程,方式是设置Thread.IsBackground 属性。

二、线程安全

线程安全:多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
线程不安全:不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据

线程安全的同步的类:
1)vector:比ArrayList多了个同步化机制(线程安全),效率低。
2)stack:堆栈。
3)hashtable:比hashmap多了个线程安全。(HashMap,TreeMap都是线程不安全)
4)enumeration:枚举,相当于迭代器。
除此之外,其他的都是非线程安全的类和接口

原文地址:https://www.cnblogs.com/yangrongkuan/p/11996347.html