java并发编程实战之多线程基础

版权声明:转载注明出处 https://blog.csdn.net/nobody_1/article/details/82151432

本文主要围绕多线程这个核心关键词,尝试以三个问题的方式对多线程基础展开讨论:

① 多线程的具体含义是什么?多线程是在一个什么样的背景下提出的?

常人思维在看到多线程则会想到单线程,多线程可以简单的理解为单线程(以下称为线程)的组合;在日常开发中我们所写的代码都是单线程的,即所有类以及类的方法只由main方法创建的主线程访问。或许这里还是很萌比,不知道什么是线程?

这里引用wiki上的解释:一个执行的线程是程序化指令中最小的事件,它由一个调度程序独立的管理,这个调度程序是操作系统的一部分。在操作系统中,线程和进程的实现并不一样,但大部分情况下进程是由多个线程组成的,即多个线程可以存在于一个进程中、多个线程可以同时执行且共享进程的资源(如内存),然而不同的进程之间却不能共享他们的资源。另外,进程中的线程们共享着它们可执行的代码以及变量的值。

如果以java作为开发语言,JVM平台在操作系统上的运行是一个进程,那么JVM内部运行的都是单个的线程,JVM内部最常见的线程则是由main方法创建的主线程,主线程会以串行的方式按照代码的编写顺序执行main方法中的代码,进而得到执行结果。至此,我们应该可以从理论和代码两方面来理解线程。

系统的调度单位是线程,同时程序中只有一个线程,则程序只能在一个处理器上运行;所以程序运行的快慢决定于处理器的性能。21世纪之前,CPU的处理能力按照摩尔定理不断提高,二十一世纪,摩尔定理失效,导致按照单线程运行的程序的性能出现了瓶颈,因此提高程序性能的途径从提高硬件处理速度转变到提升软件本身的性能上。多线程程序孕育而生。PS:目前的多核处理器是从进程的角度提升操作系统的运行速度。

结合对单线程概念的理解,不难理解多线程。

② 多线程的出现有哪些优势?带来便利的同时有哪些隐患?

针对多线程提出的背景,可知多线程的目的是提升程序(系统)的性能,即提高资源的利用率进而提升系统的吞吐率。具体体现在几个方面:

>响应能力。多线程允许运用保持对输入的响应;在单线程用,如果主线程

被阻塞在一个长时间运行的任务中,那么整个运用会出现冻结的状态。通过把长时间运行的任务单独交给另外一个可以与主线程并行执行的A线程,使得运用能够对用户的输入保持响应,而A线程在后台继续运行;另外,保持程序持续响应的方式还有非阻塞IO和Unix信号量。

>更快的执行。在多核处理器或者多进程机制的硬件上,多个线程可以并行执行。

>更低的资源消耗。多个线程共享内存和变量。

任何事情都有两面性,多线程在提升系统性能的同时,也使得开发变得更复杂。由于多线程共享相同的地址空间,因此可以随意的读写地址空间中的变量;假设出现情况:线程A读取变量i并修改i的值,线程B也执行同样的操作,因为线程A和线程B读取变量i以及修改i操作的顺序没法固定(指令重排),导致修改i之后的值并不能和预期的值相等,这种不能保证得到正确i值得情况称为线程的“安全性”。线程“安全性”问题是不可避免的,因此需要采用一定的机制解决安全性问题。

针对例子中线程A和线程B对变量i的访问存在竞争,术语上把类似于变量i的资源称为临界资源或者共享资源,竞争访问称为竞态条件

③ 如何优雅的避免多线程的缺点?

从例子中可看出“安全性”发生的根源是多个线程同时执行相同的代码或者方法,所以解决途径有两个:一是保证代码或者方法在某一时刻只能被同一个线程执行,二是保证多个线程能安全的访问同一段代码或者方法

>针对方案一,同一时刻只能被同一线程执行的代码或者方法称为同步代码块或者同步方法,这就好比十个人去KFC排队买汉堡一样,这里收银员代表代码块,十个人代表十个线程,只有当一个人(线程)点好餐且付完账以后,后面的人(线程)才能去收银员那里点餐(代码块)。在java语言中,同步机制由对象的内置锁和synchronized关键字来实现。

>针对方案二,多个线程安全的访问临界(共享)资源,则要解决资源的可见性问题,即一个线程访问且修改了某变量的状态,这种修改则对其他线程可见。比如:十个人共享一台电脑,当其中一个人修改了电脑的开机密码,则要告知其他九个人新的密码,这样才能保证任何一个人都等正确的登录电脑。在java语言中,可见性则有volatile关键字或者ThreadLocal类来实现。

 

经过对上面三个问题的讨论,对于多线程的概念以及多线程的特点有一个大概的认知,下一步则需要深入java语言理解“安全性”问题的解决办法,比如对象的内置锁、可重入锁(ReentrantLock)、synchronized关键字、volatile关键字、ThreadLocal类等的具体使用和原理。

 

参考资料:

wiki: https://en.wikipedia.org/wiki/Thread_(computing)#Threads_vs._processes

书籍:《实战Java高并发程序设计》

猜你喜欢

转载自blog.csdn.net/nobody_1/article/details/82151432
今日推荐