`

《Java并发编程实践》学习笔记之一:基础知识

    博客分类:
  • Java
阅读更多

《Java并发编程实践》学习笔记之一:基础知识

1、程序与进程

1.1 程序与进程的概念

(1)程序:一组有序的静态指令,是一种静态概念; 
(2)进程:是一种活动,它是由一个动作序列组成,每个动作是在某个数据集上执行一段程序,整个活动的结果是提供一种系统或用户功能。

1.2 进程与程序的区别

(1)进程是程序的一次运行活动,属于一种动态的概念。进程是执行程序的动态过程,而程序是进程运行的静态文本。 
(2)一个进程可以执行一个或多个程序。当然,同一程序也可能由多个进程同时执行。 
(3)程序可以作为一种软件资源长期保存着,而进程则是一次执行过程。

1.3 进程的结构

在 UNIX 或者 Linux 中, 进程是通过 FORK 系统调用被创建的。 在调用了 FORK 之后,父进程可以和子进程并行。父进程还可以创建多个子进程,也就是说,在同一时刻,一个父进程可以有多个正在运行的子进程。子进程也可以执行 FORK 调用。这样就可以在系统中生成一个进程树。

进程通常由三部分组成。一部分是程序,一部分数据集合,另一部分被称为进程控制块(ProcessControlBlock,简记PCB)。 
进程的程序部分描述了进程所要完成的功能。数据集合部分则有两方面的内容,即程序运行时所需要的数据部分和工作区。如果一个程序能为多个进程同时共享执行,它是进程执行时不可修改的部分。而数据集合部分则通常为一个进程独占,为进程的可修改部分。程序和数据集合是进程存在的物质基础,是进程的实体。 
进程控制块有时也称为进程描述块,它包含了进程的描述信息和控制信息,是进程动态特性的集中反映。

总之, 每个进程基本上有自己独立的代码和数据空间, 独立的程序计数器等上下文环境,进程切换的开销是比较大的。

2、线程

进程具备并发性的特点,这种并发性是不同的进程之间反映出来的,不同的进程有不同进程空间,进程之间的切换消耗比较大。那么就考虑到引入线程的概念,在进程的内部引入并发性,一个进程可以创建多个线程,线程之间具备并发性。不同的线程之间可以共享进程的地址空间和数据。

一般的讲, 线程是一个程序, 或者进程内部的一个顺序控制流。 线程本身不能独立运行,必须在进程中执行,使用进程的地址空间。每个线程有自己单独的程序计数器。

2.1 多线程的优势(相比多进程)

创建进程的高消耗(每个进程都有独立的数据和代码空间),进程之间通信的不方便(消息机制),进程切换的时间太长。

然而线程的切换也是需要时间的。对于单CPU,采用多线程不会提高程序的执行速度,反而会降低速度,但是对于用户来说,可以减少用户的响应时间。而对于多CPU或者 CPU 采用超线程技术的话,采用多线程技术还是会提高程序的执行速度的。

进程内的同一类线程可以共享代码和数据空间,每个线程有独立的运行栈和程序计数器,切换的开销比较小,灵活性高。在支持超线程和多核的 CPU 上,多线程能够并发或者并行执行,可以在同一时间段内完成不同的任务,或者加快程序的执行。同一进程内的多个线程,调度比较灵活,可以相互协调和协作共同完成特定任务。

2.2 Java创建多线程

Java 定义了一个线程的概念模型,把一个线程分为三部分:虚拟 CPU(java.lang.Thread类),虚拟 CPU执行的代码和数据。创建一个Thread对象就意味着创建了一个线程。

创建线程的方法就总结了,可以参考Polaris的《第一篇 多线程的使用——Thread类和Runnable接口》

根据Java线程的概念模型,继承Thread方式会将虚拟CPU和代码混合在一起,而Runnable方式将它们分开。

2.3 线程池

线程有时称为轻量级进程。与进程一样,它们拥有通过程序运行的独立的并发路径,并且每个线程都有自己的程序计数器,称为堆栈和本地变量。然而,线程存在于进程中,它们与同一进程内的其他线程共享内存、文件句柄以及每进程状态。

创建线程会使用相当一部分内存,其中包括有堆栈,以及每线程数据结构。如果创建过多线程,其中每个线程都将占用一些 CPU  时间,结果将使用许多内存来支持大量线程,每个线程都运行得很慢。这样就无法很好地使用计算资源。

可喜的是,Java自从 5.0以来,提供了线程池。线程的目标执行对象可以共享线程池中有限数目的线程对象。

一切的服务器都需要线程池,比如Web、FTP等服务器。

2.3.1 使用线程池

使用JDK提供的线程池一般分为3步:1)创建线程目标对象,可以多个;2)使用 Executors 创建线程池, 返回一个ExecutorService类型的对象;3)使用线程池执行线程目标对象,exec.execute(run),最后,结束线程池中的线程,exec.shutdown()。

3、总结

以上大部分知识点在后面的章节会详细介绍。

注:写完这些后,阅读英文原版,发现第一章不是这些内容,这一章似乎是中文翻译者加上去的,又或者是网络上谁流传的。不过竟然笔记写好了,也就留下来,毕竟讲得也不错。

0
0
分享到:
评论

相关推荐

    Java并发实践-学习笔记

    这份"Java并发实践-学习笔记"涵盖了这个关键主题,旨在帮助开发者深入理解和掌握Java中的并发机制。以下是对这份笔记可能包含的一些核心知识点的详细阐述: 1. **Java并发基础**:首先,笔记可能会介绍Java并发的...

    Java基础尚硅谷宋红康学习笔记

    10. **Java并发编程**:包括线程池、锁机制(如synchronized、ReentrantLock)、并发容器(如ConcurrentHashMap、CopyOnWriteArrayList)以及并发工具类(如CountDownLatch、CyclicBarrier)。 这些是Java基础知识...

    【Java技术资料】-(机构内训资料)Java并发体系学习思维笔记

    这份机构内训资料,通过“Java并发体系学习思维笔记”,为我们揭示了Java并发编程的核心概念、最佳实践以及常见问题的解决策略。 首先,我们需要理解Java并发的基础,这包括线程的创建与管理。Java提供了两种主要的...

    Java面试题和学习笔记

    Linux面试专题及答案+ActiveMQ消息中间件面试专题+Java基础面试题+MySQL性能优化的21个最佳实践+微服务面试专题及答案+深入理解java虚拟机+设计模式面试专题及答案+开源框架面试专题及答案+并发编程及答案+Spring...

    2019年魔乐Java培训课堂原版笔记-Word版.zip

    作为阿里云社区和阿里云大学Java学习路线的一部分,这些笔记为学员提供了系统化的学习资料,旨在帮助他们扎实地掌握Java编程的基础知识。 1-第一天-魔乐java基础视频学习笔记.docx:这部分内容可能包括Java语言的...

    Java编程思想学习笔记

    在讨论Java编程思想学习笔记时,首先需要了解的是Java语言的平台无关性,而这一特性正是通过Java虚拟机(JVM)得以实现的。JVM作为Java程序设计的关键组成部分,对于Java开发人员来说是必须掌握的基础知识。在该学习...

    Java入门学习笔记

    总之,这份"Java入门学习笔记"是一个全面的Java学习资源,覆盖了从基础知识到高级特性的广泛内容,对于想要踏入Java编程世界的新手来说,是一份不可多得的参考资料。通过阅读并实践这些笔记,初学者不仅可以掌握Java...

    Java基础知识学习笔记

    这份"Java基础知识学习笔记"显然是一份集大成者的学习资料,对于初学者和有一定经验的开发者来说,都是宝贵的资源。以下是对这些笔记可能包含的重要知识点的详细说明: 1. **Java语法基础**:包括变量、数据类型...

    Java学习资料-并发编程.zip

    通过学习这个资源包,你可以系统地掌握Java并发编程的基础和进阶知识,提升在多线程环境下的编程能力,为开发高并发、高性能的Java应用打下坚实基础。在实践中不断学习和调试这些代码,将有助于深化理论知识的理解,...

    Java JDK 6学习笔记——ppt简体版

    Java JDK 6学习笔记是为Java初学者量身定制的一份宝贵资料,它涵盖了Java编程的基础概念、语法以及核心特性。这份PPT简体版旨在帮助读者快速掌握Java开发的基本技能,逐步成为一名合格的Java程序员。 Java JDK...

    Java学习笔记(源码)

    【Java学习笔记(源码)】是一份详细记录了Java编程语言学习过程的资源集合,包含实际的源代码示例。这份笔记旨在帮助初学者和有一定经验的开发者深入理解和掌握Java语言的核心概念、语法以及常见应用。以下是笔记中...

    《Java学习笔记》

    这份《Java学习笔记》包含了丰富的知识内容,旨在帮助学习者全面掌握Java编程技术。笔记分为7个PDF部分,覆盖了从基础到高级的Java编程概念。 1. **Java基础知识**:这部分内容通常包括Java的历史背景、环境配置、...

    java基础的详细案例笔记

    Java基础是编程世界中至关重要的一步,尤其对于初学者来说,掌握好Java基础知识将为后续的进阶学习打下坚实的基础。"Java基础的详细案例笔记"无疑是一份宝贵的资源,它涵盖了学习Java过程中最核心的概念和实战技巧。...

    Java高并发视频教学,并带实战java高并发程序设计,高并发面试题目

    "java高并发.txt"可能是一份文档或笔记,涵盖了Java并发编程的核心概念和技术。它可能详细解释了线程的生命周期、线程安全问题(如数据竞争、活锁、死锁)、并发工具类(如CountDownLatch、CyclicBarrier、Semaphore...

    Java+JDK6学习笔记

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。JDK(Java Development Kit)则是Java编程的基础,它包含了Java运行环境、编译器和其他开发工具。本篇将围绕“Java+JDK6学习笔记”展开,...

    Java开发学习笔记

    Java开发学习笔记主要针对的是初学者,旨在帮助他们掌握Java编程的基础知识。下面将详细讲解Java开发中的核心概念和步骤。 一、Java环境变量设置 在开始Java编程之前,我们需要安装Java Development Kit (JDK)并...

    Java JDK 6学习笔记.zip

    此外,还可能包含关于错误处理、内存管理、并发编程、设计模式和最佳实践等方面的内容,这些都是Java开发者必备的知识。 为了充分利用这些学习资料,建议首先了解Java的基础知识,然后逐个章节深入学习,同时结合...

    java校招学习笔记

    "java校招学习笔记"显然是针对应届毕业生或求职者准备的,旨在帮助他们掌握Java的基础知识和校招面试中常见的技术问题。这份笔记可能包含了从基础概念到进阶主题的全面概述,以提高求职者的竞争力。 首先,Java的...

Global site tag (gtag.js) - Google Analytics