如何判断是否开启超线程

一  基础

进程是程序向操作系统申请资源(如内存空间和文件句柄)的基本单位。线程是进程中可独立执行的最小单位。

在Java平台中创建一个线程就是创建一个Thread类(或其子类)的实例。

运行一个线程实际上就是让Java虚拟机执行该线程的run方法,从而使相应线程的任务处理逻辑代码得以执行。

Thread类的两个常用构造器是:Thread() 和 Thread(Runnable target) 。(Thread的run方法里会判断target !=null,所以Tread类实际上是Runnable接口的一个实现类。)

如:

  Thread testThread = new TestThread();  

  class TestThread extends Thread

  Thread testThread = new Thread(new TestThread());
  class TestThread implements Runnable

testThread.start(),class里重写run方法,run里是自己的逻辑代码。run方法总是由Java虚拟机直接调用,我们能直接调,但这蠢事没人干。
我们一般使用第二种方法创建线程,因为它基于组合,比继承灵活。但是,第二种创建方式意味着多个线程实例可以共享同一个Runnable实例,这可能因此竞态和线程安全相关问题。

run方法执行结束,线程占用的资源会被Java虚拟机回收。(线程池的原理是让run方法永远运行不完么)

由于同一段代码可以被多个线程执行,因此当前线程是相对的。

线程的优先级属性本质上只是一个给线程调度器的提示信息。

Java中的线程分为守护线程和用户线程。

用户线程会阻止Java虚拟机的正常停止,即一个Java虚拟机只有在其所有用户线程都运行结束的情况下才能正常停止。如果用kill命令杀Java虚拟机进程,那即使用户线程也无法阻止Java虚拟机的停止。

而守护线程不会影像Java虚拟机的正常停止,即应用程序中的守护线程在运行也不影响Java虚拟机的正常停止。因此,守护线程通常用于执行一些重要性不高的任务,例如用于监视其他线程的运行情况。

常用方法:run  虚拟机调用;start  一个thread实例的start方法只能被调一次,多了会异常;join  线程a调用线程b的join方法,线程a的运行会被暂停,直到线程b运行结束;yield      使当前线程可能主动放弃对处理器的占用,导致当前线程被暂停,相当于对程序调度器说:我不急,有人用就先让别人用,真没人用就我用; sleep  使当前线程休眠指定时间。

Java虚拟机启动的时候会创建一个main线程,该线程负责执行Java程序的入口方法(main方法)。web应用中的servlet类的doget、dopot方法也总是由确定的线程负责执行的。垃圾回收有专门的线程。动态编译有专门的线程。在多线程编程中,弄清楚一段代码具体是由哪个或哪种线程去负责执行的这点很重要,这关系到性能、线程安全等问题。

线程的生命周期共有6种状态,new,runnable,blocked,waiting,timed_waiting,terminated。

对线程进行监视的主要途径是获取并查看程序的线程转储(Thread Dump),它包含了获取这个线程转储的那一刻该程序的线程信息。

从软件的角度来说,并发就是在一段时间内以交替的方式去完成多个任务,而并行就是以齐头并进的方式去完成多个任务。软件要以并发的方式去完成几个任务往往需要借助多个线程(而不是一个线程)。

从硬件的角度来说,一个处理器一次只能运行一个线程,处理器是通过时间片分配实现同一段时间运行多个线程,因此一个处理器可以实现并发,而并行需要多个处理器。

竞态:结果有时对,有时错,正确性和时间有关。比如多个线程取到相同的值,就是因为一个线程对共享值的更新覆盖了其他线程对该值的更新。所以,竞态往往伴随着读取脏数据,和丢失更新。

synchronized关键字会使其修师的方法在任一时刻只能够被一个线程执行。

一个类如果不是线程安全的,我们就说它在多线程环境下直接使用存在线程安全问题。线程安全问题概况来说表现为3个方面:原子性、可见性和有序性。

原子性的不可分割:线程执行某个共享变量,对其他线程来说,该操作要么已经执行结束要么尚未发生。

Java有两种方式实现原子性,一种是使用锁,另一种是利用处理器提供的专门CAS执行。CAS与锁本质相同,差别在于锁在软件层实现,CAS在硬件层实现(处理器和内存)。

Java语言除了long和double,其他基本类型的写操作都是原子操作,有Java虚拟机具体实现。

原子性指操作不能被中断,可见性指多线程之间对共享变量的修改是否进行了处理器的缓存同步而被其他线程实时读取到,有序性指源码顺序和处理器执行顺序可能不一样,反正这三个在Java中都可以通过volatile修饰来避免线程安全问题。

我不想做笔记了,用别人的吧。Java多线程编程实战指南(核心篇)读书笔记

补充一点——Java多线程程序的调试与测试:

针对多线程程序的测试框架和工具还没有,而junit也不支持测试多线程。能用静态检查工具FindBugs;但它会有误报。

或者直接代码审查;

OpenJDK下有一个多线程程序单元测试的试验项目:JCStress

开发必会系列:《Java多线程编程实战》读书笔记的更多相关文章

  1. Spring 实战 第4版 读书笔记

    第一部分:Spring的核心 1.第一章:Spring之旅 1.1.简化Java开发 创建Spring的主要目的是用来替代更加重量级的企业级Java技术,尤其是EJB.相对EJB来说,Spring提供 ...

  2. 深入浅出MySQL 数据库开发、优化与管理维护(第2版) -- 读书笔记 -- 基础篇

      1.切换数据库 use blog; 2.显示当前数据库 所有的表. show tables; +----------------+ | Tables_in_blog | +------------ ...

  3. Spring实战第4版PDF下载含源码

    下载链接 扫描右侧公告中二维码,回复[spring实战]即可获取所有链接. 读者评价 看了一半后在做评论,物流速度挺快,正版行货,只是运输过程有点印记,但是想必大家和你关注内容,spring 4必之3 ...

  4. Spring实战(第4版).pdf - 百度云资源

    http://www.supan.vip/spring%E5%AE%9E%E6%88%98 Spring实战(第4版).pdf 关于本书 Spring框架是以简化Java EE应用程序的开发为目标而创 ...

  5. Spring实战第六章学习笔记————渲染Web视图

    Spring实战第六章学习笔记----渲染Web视图 理解视图解析 在之前所编写的控制器方法都没有直接产生浏览器所需的HTML.这些方法只是将一些数据传入到模型中然后再将模型传递给一个用来渲染的视图. ...

  6. Spring实战第五章学习笔记————构建Spring Web应用程序

    Spring实战第五章学习笔记----构建Spring Web应用程序 Spring MVC基于模型-视图-控制器(Model-View-Controller)模式实现,它能够构建像Spring框架那 ...

  7. Spring实战第四章学习笔记————面向切面的Spring

    Spring实战第四章学习笔记----面向切面的Spring 什么是面向切面的编程 我们把影响应用多处的功能描述为横切关注点.比如安全就是一个横切关注点,应用中许多方法都会涉及安全规则.而切面可以帮我 ...

  8. 将Spring实战第5版中Spring HATEOAS部分代码迁移到Spring HATEOAS 1.0

    最近在阅读Spring实战第五版中文版,书中第6章关于Spring HATEOAS部分代码使用的是Spring HATEOAS 0.25的版本,而最新的Spring HATEOAS 1.0对旧版的AP ...

  9. ASP.NET MVC开发必看系列

    一.关于HTTP协议的那些事 这可以说我们开发WEB程序的空气,推荐不断温故知新! HTTP协议 (一) HTTP协议详解 HTTP协议 (二) 基本认证 HTTP协议 (三) 压缩 HTTP协议 ( ...

  10. Spring实战 (第3版)——AOP

    在软件开发中,分布于应用中多处的功能被称为横切关注点.通常,这些横切关注点从概念上是与应用的 业务逻辑相分离的(但是往往直接嵌入到应用的业务逻辑之中).将这些横切关注点与业务逻辑相分离正是 面向切面编 ...

随机推荐

  1. CF1010C Border 题解

    题目传送门 前置知识 最大公约数 | 裴蜀定理 简化题意 给定一个长度为 \(n\) 的序列 \(a\),求 \((\sum\limits_{i=1}^{n}d_ia_i) \bmod k\) 一共会 ...

  2. Flutter学习(一)——创建一个项目

    本文基于 flutter 2.5.1,开发工具 Visual Studio Code. 一.创建 打开 VS Code 点击 View > Command Palette-(快捷键command ...

  3. Jenkins共享库使用

    简单使用 共享库(Shared libraries)是一种可以用来封装函数.变量甚至整个 Pipeline 的机制.通过共享库,可以将常用的功能和流程逻辑定义在单独的 Groovy 脚本中,然后在多个 ...

  4. FFmpeg开发笔记(十一):ffmpeg在移植到海思HI35xx平台之将ffmpeg库引入到sample的demo中

    前言   上一篇交叉编译了ffmpeg的海思版本,使用交叉编译的qt的ffmpeg播放器在海思上播放,本片是将ffmpeg的环境添加进海思的sample环境中.   在海思sample中引入ffmpe ...

  5. day05---系统的重要文件(3)

    1) /usr/local 编辑 安装的软件 第三方软件安装位置 软件安装的三种方法 1.yum安装 自动解决依赖问题 yum [选项参数] 包名 第一个里程碑:我想要安装的软件的名字 或者是 知道命 ...

  6. Django多方式登录认证

    多方式认证原理 我们平常使用的Django登录认证是django.contrib.auth.authenticate 点进去源码,我们会看到这个函数,真正的认证类是它里面的那个 继续点进去源码,会看到 ...

  7. Elasticsearch系列之-windows安装和基础操作

    ElasticSearch安装 安装JDK环境 因为ElasticSearch是用Java语言编写的,所以必须安装JDK的环境,并且是JDK 1.8以上 官网:https://www.oracle.c ...

  8. 03、Etcd 客户端常用命令

    上一讲我们安装 etcd 服务端,这一讲我们来一起学学如何使用 etcd 客户端常见的命令.文章内容来源于参考资料,如若侵权,请联系删除,谢谢. etcd可通过客户端命令行工具 etcdctl 对et ...

  9. Unity3D之OnTriggerEnter和OnCollisionEnter

    OnCollisionEnter方法要求碰撞的发起方必须拥有刚体,而被碰撞方有没有刚体并不重要; OnTriggerEnter方法则对此没有要求,只需要碰撞双方有一个具有刚体即可触发,当有物体勾选is ...

  10. 【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.

    问题描述 PHP的Web Job,通过artisan来配置路径启动PHP任务,相关启动脚本如下: artisan_path = "d:\\home\\site\\wwwroot"; ...