前两篇文章分别讲了,Java线程相关基础概念以及线程的内存模型,本节作为后续章节的引导,个人认为对于学习后面的只是还是比较重要。好了,既然说了多线程,那么首先要弄清以下几个问题:

1. 什么是多线程?

2. 为什么要使用多线程?

3. 在什么场景下使用多线程?

4. 使用多线程会导致什么问题?

5. 如何正确使用多线程?

6. 如何高效使用多线程?

对于问题1,什么是多线程?我们知道现代计算机操作系统基本上都是多道的,什么是多道操作系统,说白了就是允许多个进程同时运行的操作系统。而对于一个进程而言必然会后一个主线程作为执行程序代码的实际执行者,这样的程序就属于单进程单线程的程序,如果在主线程中又构建了一个或者多个子线程,那么这个程序就是单进程多线程的程序。

对于问题2,为什么要使用多线程?我们知道计算机的基本组成包括CPU(控制器、运算器)、内存,外存(如硬盘)、输入输出设备;现代计算机的cpu速度是非常快的,内存和外存设备的速度是相对比较慢的,依次都是差距很多数量级的。cpu执行的速度远远大于内存和外存速度,那么就会出现一个问题,就是cpu的利用率的问题。比如让计算机到硬盘中去一个文件然后打印出来其中的内容,那么过程大致是cpu->操作系统->硬盘->内存->cpu,其中我们知道cpu与内存与硬盘的速度差距非常大,那么耗时最长的就是访问硬盘,点到为止,假设完成这个任务cpu执行时间是1s,内存10s,磁盘100s,那么完成这个任务所需的时间大致是111s,我们可以看出计算机主要瓶颈发生在磁盘访问这里,cpu的空闲时间也就是99s,这对于昂贵的cpu来说是严重的浪费,那么怎么才能减少cpu的浪费呢。答案是多个进程,多个线程。这样在一个线程或者进程被cpu暂时停止执行时,有其他的可以被cpu执行这样就可以是cpu繁忙起来,不会导致浪费,当然也不是一定把cpu累死,有一定的上限。

对于问题3,在什么场景下使用多线程?简单来说就是在能够提升cpu利用率,提高完成任务效率的情况下就可以使用多线程。

对于问题4,使用多线程会导致什么问题?多线程可能导致的问题就是资源争用、数据一致性问题以及上下文切换带来的资源和性能的消耗。

对于问题5,如何正确使用多线程?对于java来说有final,synchronized,lock,volatile以及并发库来保证线程安全。

对于问题6,如何高效使用多线程?高效的多线程jvm自身提供了很多机制优化锁提升多线程效率,对于程序员在编程是可以采用锁细化,锁代替以及高效并发库等方式来高效使用多线程并且保证线程安全。

ok,下面张姐结合着6个基本问题分别讲述。

java核心技术-多线程之引导概念的更多相关文章

  1. java核心技术-多线程之线程基础

    说起线程,无法免俗首先要弄清楚的三个概念就是:进程.线程.协程.OK,那什么是进程,什么是线程,哪协程又是啥东西.进程:进程可以简单的理解为运行在操作系统中的程序,程序时静态代码,进程是动态运行着的代 ...

  2. java核心技术-多线程基础

    进程.线程 ​ 进程(Process) 是程序的运行实例.例如,一个运行的 Eclipse 就是一个进程.进程是程序向操作系统申请资源(如内存空间和文件句柄)的基本单位.线程(Thread)是进程中可 ...

  3. java核心技术-多线程之线程内存模型

    对于每一种编程语言,理解它的内存模型是理所当然的重要.下面我们从jvm的内存模型来体会下java(不限java语言,严格来讲是JVM内存模型,所有JVM体系的变成语言均适用)的内存模型. 堆: 就是我 ...

  4. java核心技术-多线程之基本使用

    多线程程序好处就是可以提高cpu使用率和系统的性能.这里举个例子,民以食为天,咱们以餐馆为例(后面基本上都用餐馆作为对象),后面如果没有特殊说明均采用本节相关术语,围绕餐馆我们可以抽象出如下几个角色以 ...

  5. Java的多线程机制系列:(一)总述及基础概念

    前言 这一系列多线程的文章,一方面是个人对Java现有的多线程机制的学习和记录,另一方面是希望能给不熟悉Java多线程机制.或有一定基础但理解还不够深的读者一个比较全面的介绍,旨在使读者对Java的多 ...

  6. Java 多线程的基本概念

    一.线程介绍 多线程同时运行时,单CPU系统实际上是分给每个线程固定的时间片,用这种方式使得线程“看起来像是并行的”.在多CPU系统中,每个CPU可以单独运行一个线程,实现真正意义上的并行,但是如果线 ...

  7. java 并发多线程 锁的分类概念介绍 多线程下篇(二)

    接下来对锁的概念再次进行深入的介绍 之前反复的提到锁,通常的理解就是,锁---互斥---同步---阻塞 其实这是常用的独占锁(排它锁)的概念,也是一种简单粗暴的解决方案 抗战电影中,经常出现为了阻止日 ...

  8. java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)

    目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...

  9. JAVA之多线程概念及其几种实现方法优劣分析

    1. 多线程 程序:指令集,静态的概念 进程:操作系统调动程序,是程序的一次动态执行过程,动态的概念 线程:在进程内的多条执行路径 Ps:单核的话进程都是虚拟模拟出来的,多核处理器才可以执行真正的多线 ...

随机推荐

  1. Raspberry Pi - Huawei HiLink E3256 3G modem to ethernet adapter

    Raspberry Pi - Huawei HiLink E3256 3G modem to ethernet adapter This page documents how to configure ...

  2. 【Android Studio使用教程1】Android Studio导入项目的几种方法

    本篇教程中使用到的Android Studio版本为1.0, Eclipse ADT版本23.0.4.请尝试更新到该版本. Android Studio默认使用 Gradle 构建项目, Eclips ...

  3. Appium+java移动端项目测试问题整理

    一.每次打开APP都要重新安装.充值账号密码 解决:打开appium,设备,Use Browser  ,勾选“No Reset”   二.一个页面包含相同文字,打开页面路径错误 问题描述:APP处于[ ...

  4. Python用户交互-密码不可见

    输入密码时若让用户不可见,可以使用getpass模块中的getpass方法 # 输入密码时若想要不可见,使用getpass模块中getpass方法即可 import getpass pwd=getpa ...

  5. SqlServer 批量添加记录

    declare @i int ) begin INSERT INTO [dbo].[Settlements] ([ID] ,[Count] ,[SettlementDate]) VALUES ( ne ...

  6. How to rename table name

    How to rename table name eg.  rename emp to emp01; see aslo: https://docs.oracle.com/javadb/10.8.3.0 ...

  7. 猴子选大王【PHP】

    目录 猴子选大王 指针解决 数组压栈 猴子选大王 一群猴子排成一圈,按1,2,...,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不 ...

  8. 沉淀再出发:如何在eclipse中查看java的核心代码

    沉淀再出发:如何在eclipse中查看java的核心代码 一.前言   很多时候我们在eclipse中按F3键打算查看某一个系统类的定义的时候,总是弹出找不到类这样的界面,这里我们把核心对应的代码加进 ...

  9. 栋哥你好,让我们回顾最初认识C++的时候(课堂作业)

    计算器的第一步,至今还记记忆犹新,本次的课堂作业,便是那个框架.闲话少叙,代码如下传送门: Main.cpp #include "stdafx.h" #include<ios ...

  10. BZOJ 1562 变换序列 二分图匹配+字典序

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1562 题目大意: 思路: 逆序匹配,加边匹配的时候保持字典序小的先加入. 具体证明:h ...