Java-多线程基础篇

前言:

以下是看马老师的视频以及自己阅读《Java多线程编程实战指南》所总结的基础内容,只是个人理解,如有不对还请大家指正。

1.线程的概念:

来自于百度百科:线程是独立调度和分派的基本单位。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。

2.线程相关概念:

2.1 串行,并行,并发

计算机的任务/事情所耗费总时间是包括:实际做事时间+等待时间,因为有一些任务是需要等待的,如IO任务。假设A总15(实际做事时间5,等待10),B总10(做事2,等待8),C总10(做事10,等待0)。

如下图,串行容易理解,先做A,再做B,再做C,所以15+10+10

并发好处是上个任务等待时间可以进行下个任务开始做事,所以是5+2+10=17

并行就是极致的并发,理想型并发,总时长取决于最长时间,所以是15。

从硬件角度,在一个处理一次只能运行一个线程情况下,处理器是利用时间片分配技术来实现同一个时间段运行多个线程,因此一个处理器可以实现并发,并发这种方式更多是在多核上同一时间运行一个线程来实现。

还有一点,并发不一定会比串行来的效率更高或者效率提高那么明显。

2.2 竞态:

多线程编程中,有时候相同的输入,程序输出有时候正确,有时候错误,计算结果的正确性与时间有关的现象称为竞态。由于竞态常常伴随这脏读,简单的例子就是 多个线程都对某个共享变量进行递增操作,一个线程在写变量,但是这个递增动作还没完成,而另个线程读取的值是之前的值,导致了它递增的动作还是再原来值增加,覆盖了前一个线程的值,导致两次递增的结果是相同的。

竞态最常见的典型实例是在:read-modify-write(读-改-写)和check-then-act(检测后行动)

2.3 安全性

一个类在单线程环境下能够正常运行,并且在多线程环境下,使用方不必为其改变的情况下也能运行正常,那么我们就称为线程安全,对应的这个类是具有线程安全的。反之,单线程运行正常,多线程则无法正常运行,这个类就是非线程安全的。

2.4 原子性

原子字面意思是不可分割,对于涉及共享变量访问的操作,若该操作从其执行线程以外的任意线程来看是不可分割的,那么该才做就是原子操作,相应的我们称该操作具有原子性。

这边不可分割,是指访问(读、写)某个共享变量的操作从其执行线程以外的任意线程来看,该操作要么已经执行要么尚未发生,其他线程不会“看到”该操作执行了部分中间结果。两种方式来实现原子性,一种就是使用锁,锁具有排他性,通常是软件层面实现,一种是处理器专门CAS(compare-and-Swap)指令,可以认为是一种“硬件锁”。

2.5 可见性

多线程环境下,一个线程对某个共享变量进行更新后,后续访问该变量的线程可能无法立刻读取到这个更新结果,甚至永远也无法读取到这个更新结果。

2.6 有序性和重排序

有序性是指在什么情况下一个处理器上运行的一个线程所执行的内存访问操作在另个处理器上运行的其他线程看起来乱序的。两个操作在代码上是有先后关系的,但是编译器可能改变两个操作的先后顺序,处理器可能不是按照程序的代码指定顺序执行指令,这种现象就是重排序,它是一种内存访问(读和写)的一种优化,不影响单线程正确性提高程序性能。

2.7 锁

这里面涉及了很多概念,原子性,可见性,重排序,那么一个好的多线程编程肯定是要保障原子性+可见性+有序性,很容易联想到就是,一个共享数据一次只能被一个线程访问,锁也是这种机制保障了线程安全的同步机制。

线程可以获得或者释放对应的锁,在这段时间内执行的代码成为“临界区”。锁有内部锁(synchronized关键字)和显式锁(java.concurrent.locks.lock接口实现类)。

锁具有排他性,也就是互斥,所以它满足了代码只能被一个线程执行,自然而然具有不可分割的特性,所以具备了原子性。同时锁的机制,在锁释放时候回冲刷处理器缓存动作,保证锁改变的共享变量能够被其他线程同步,所以保证了可见性。最后,锁能够保证有序性,就是在其他线程看来,临界区里面共享变量是同一时刻更新的,但是有一点需要注意,临界区内的任意两个操作依然可以再临界区之内被重新排序(不会排序到临界区外),这里结合后面可见性例子可以参考一下。

锁还有一个概念,可重入性,一个线程持有一个锁时候,还能继续成功申请该锁,就是可重入的锁,反之就是非可重入的锁。

线程同步机制底层是通过“内存屏障”来实现的,其作用的是保证持有锁线程能够读取到最新数据,并且持有线程对共享数据所做的更改,对后续线程可见,这里原文有很多,就不展开讲。

2.8 volatile关键字

书本上写着volatile关键字的作用是,保障可见性,保障了有序性,保障了long/double型变量读写操作的原子性。马老师课上说的这样,volatile保证了可见性,防止代码重排序。

3.线程启动方式:

java线程启动方式其实是有三种,一种是类继承Thread,一种是类实现Runnable接口,在new并将相应类对象输入Thread对象中,代码是第三种其实是第二种的变形。其实还有一种方式,是线程池的方式,Executors.newCacheThread方式。

public class Thread_base {

    private static class T1 extends Thread{


        @Override
        public void run() {
            System.out.println("T1");
        }
    }

    private static class T2 implements Runnable{
        @Override
        public void run() {
            System.out.println("T2");
        }
    }

    public static void main(String[] args) {
        new T1().start(); //第一种
        new Thread(new T2()).start(); //第二种
        new Thread(()->{
            System.out.println("hello new");
        }).start(); //这种其实是第二种变形

    }
}

3.1线程状态的转换:

NEW,一个已创建而为启动线程,由于一个线程实例只能被启动一次,因此一个线程只可能有一个该状态。

RUNNABLE,一个复合状态包括两个子状态,READY和RUNNING。前者表示处于该状态线程可以被线程调度器进行调度而使之处于RUNNING状态,后者表示处于该状态正在运行,即对象的run方法对应指令正在处理器执行。

BLOCKED,一个线程发起一个阻塞式IO操作,或者申请一个由其他线程持有独占资源(锁),处于该状态,BLOCKED状态的线程并不会占用处理器资源。

WAITING,一个线程执行了某个特别方法就会处于这种等待其他线程执行另外一些特定操作的状态。包括Object.wait(),Thread.join()和lockSupport.park(Object),而能从WAITING变更为RUNNABLE的相应方法包括:Object.notify()/notifyALL()和LockSupport.unpart(Object)

TIMED_WAITING:该状态和WAITING类似,差别在于处于该状态的线程并非无限制等待其他线程执行特定操作,而是处于带有时间限制的等待状态。当其他线程没有在指定时间执行线程所期望的特定操作时,该线程的状态自动转换为RUNNABLE.

TERMINATED:已经执行结束的线程处于该状态.Thread.run()正常返回或者由于抛出异常而提前终止都会导致对应线程处于该状态。

一个线程在其整个生命周期中,只可能有一次处于NEW状态和TERMINATED状态。

3.2线程常用方法:

待续

参考文献

《Java多线程编程实战指南-核心篇》

马士兵多线程课程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/141616.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件测试之蚂蚁金服面试题,含答案

对于想要去面试的小伙伴们看过来,小编为大家总结了蚂蚁的面试题,其实很多面试题很多公司都差不多。主要看自己如何灵活回答,大家可以灵活回应。希望对大家有所帮助。 一:基础部分: Q1. 什么是软件测试? 答…

怎么在web显示模型的动态应力图?

要在网页上显示模型的动态应力图,需要执行几个步骤。动态应力图通常涉及有限元分析 (FEA) 模拟中的应力和应变数据的可视化,可以使用 Python、JavaScript 等工具以及 Three.js、Plotly 或 D3.js 等库来渲染图一个网页。以下是该过程的概述: …

实施MES管理系统项目的三个重要阶段

在现今这个高速发展的时代,每个企业都追求更高的生产效率和更精准的管理。MES管理系统作为助力企业实现这些目标的重要工具,其实施与运营显得尤为关键。以下是我们在实践中总结出的经验与建议,希望为准备引入MES管理系统的企业提供有价值的参…

代码随想录算法训练营第20天|654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

JAVA代码编写 654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树…

linux时间同步

搭建集群时,都会先设置时间同步,否则会出现多种问题。 方式一: 1.安装ntp软件 yum install -y ntp 2.更新时区 删除原有时区:sudo rm -f /etc/localtime 加载新时区:sudo ln -s /usr/share/zoneinfo/Asia/Shangh…

快来看呦!制作3D翻页产品宣传册原来这么受欢迎!

制作3D翻页产品宣传册不但使产品在表达效果上看上去更为绚丽多彩,并且具备比较强的立体视觉效果,增加大家浏览观看的吸引力,而且还便于传播,短时间里增加品牌的影响力。 那么,我们应该如何制作3D翻页产品宣传册&#x…

reticulate | R-python调用 | 安装及配置 | conda文件配置

reticulate | R-python安装及配置 | conda文件配置 1. 基础知识2. 安装reticulate from CRAN3. 包含了用于Python和R之间协同操作的全套工具,在R和Rstudio中均可使用4. 配置python环境4.1 4种环境配置方式4.2 miniconda 环境install_miniconda()报错一install_minic…

企业大数据治理管理平台解决方案:PPT全文33页,附下载

关键词:数据治理解决方案,大数据治理,数据治理的目的和意义 一、数据治理定义 数据治理是指根据数据全生命周期、数据整体流向,将数据作为企业资产进行整体管控、人员绩效评判和风险管理工作的整套治理体系。数据治理旨在保障企…

Java 之集合框架的详细介绍

文章目录 总的介绍1. **Collection 接口**2. **List 接口**3. **Set 接口**4. **Map 接口**5. **HashMap、LinkedHashMap、TreeMap**6. **Queue 接口**7. **Deque 接口** ArrayList 类1. **创建 ArrayList:**2. **添加元素:**3. **插入元素:*…

Antv/G2 折线图 使用 DataSet 进行数据排序

DataSet 文档 G2 3.2 DataSet 文档 安装 浏览器引入 可以通过 <script> 标签引入在线资源或者本地脚本&#xff1a; <!-- 引入在线资源 --> <script src"https://unpkg.com/antv/data-set"></script><!-- 引入本地脚本 --> <sc…

Linux学习第41天:Linux SPI 驱动实验(二):乾坤大挪移

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本章的思维导图如下&#xff1a; 二、I.MX6U SPI主机驱动分析 主机驱动一般都是由SOC厂商写好的。不作为重点需要掌握的内容。 三、SPI设备驱动编写流程 1、SP…

软件测试面试,一份八股文足矣(含文档)

前言 在我认为&#xff0c;对于测试面试以及进阶的最佳学习方法莫过于刷题博客书籍视频总结&#xff0c;前几者我将淋漓尽致地挥毫于这篇博客文章中&#xff0c;至于总结在于个人&#xff0c;实际上越到后面你会发现面试并不难&#xff0c;其次就是在刷题的过程中有没有去思考…

Topaz Photo AI for Mac/win(人工智能降噪软件) 完美兼容激活版

Topaz Photo AI是一款基于人工智能的照片编辑软件&#xff0c;具有革命性的功能。它提供了强大的工具和技术&#xff0c;让用户能够编辑照片而不降低质量。该软件具备高清晰度效果、降噪和自动照片润色工具&#xff0c;能够帮助用户制作令人惊叹的照片。 它包括复杂的锐化算法…

DNS域名解析

目录 1.概述 1.1产生原因 1.2作用 1.3连接方式 1.4因特网的域名结构 1.4.1拓扑 1.4.2分类 1.4.3域名服务器类型划分 2. DNS域名解析过程 2.1分类 2.2解析图 2.2.2过程分析 3.搭建DNS域名解析服务器 3.1.概述 3.2安装软件 3.3bind服务中三个关键文件 3.4主配置…

Matplotlib的使用方法

Matplotlib是Python最著名的绘图库&#xff0c;它提供了一整套和Matlab相似的命令API&#xff0c;十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件&#xff0c;嵌入到GUI应用程序中。Matplotlib能够创建多数类型的图表&#xff0c;如条形图、散点图、条形图、饼图…

mysql之正则表达式匹配

题目&#xff1a; 今天在牛客网看到一道关于数据库正则表达式匹配的问题&#xff0c;发现自己一点不会做。 正则表达式&#xff1a; 一、正则表达式 MySQL 正则表达式通常是在检索数据库记录的时候&#xff0c;根据指定的匹配模式匹配记录中 符合要求的特殊字符串。MySQL 的…

JavaScript事件处理

在IE 3.0和Netscape 2.0浏览器中开始出现事件。DOM 2规范开始标准化DOM事件&#xff0c;直到2004年发布DOM 3.0时&#xff0c;W3C才完善事件模型。目前&#xff0c;所有主流浏览器都支持DOM 2事件模块。IE8及其早期版本还继续使用IE事件模块。 1、事件基础 1.1、事件模型 在…

deepstream生成pipeline拓扑图的方法

deepstream生成pipeline拓扑图的方法 1、前期工作1.1 安装dot 2、使用命令行生成2.1、添加环境变量2.2 、运行管道2.3 、使用dot 生成png图片 3、在c中使用3.1、添加代码3.2、运行代码3.3 、使用dot 生成png图片 4、在python中使用4.1、添加代码4.2 、使用dot 生成png图片 1、前…

【机器学习基础】机器学习入门(2)

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;后面的内容会越来越有意思~ &#x1f4a1;往期推荐&#xff1a;【机器学习基础】机器学习入门&#xff08;1&#xff09; &#x1f4a1;…

设计模式之工厂模式 ( Factory Pattern )(1)

其他设计模式也会后续更新… 设计模式其实需要有一定开发经验才好理解&#xff0c;对代码有一定的设计要求&#xff0c;工作中融入才是最好的 工厂模式 ( Factory Pattern ) 工厂模式&#xff08;Factory Pattern&#xff09;提供了一种创建对象的最佳方式 工厂模式在创建对…
最新文章