Java的多线程

Java的多线程,第1张

Java的多线程 什么是线程

线程是一种轻量级进程,线程和进程的区别在于进程是 *** 作系统独立分配资源(这里的资源可以粗略的理解为内存)的最小单位,而线程是执行任务的最小单位,线程共享内存资源,但是独立执行任务;

这里的最好理解可以看一下计算机 *** 作系统演变过程中的进程的演变过程;

当一个进程下的多个线程同时工作,共享内存资源的时候就出现了并发环境下的数据同步问题;如何保证多个线程在对共享数据进行 *** 作的时候不会出现并发问题就是多线程所要解决的问题,Java提供了一系列同步手段来在保证效率的情况下实现多线程之间的数据同步问题;

要理解这些同步手段就要从虚拟机的角度出发,搞清楚底层原理;

首先理解一下Java的内存模型;

Java内存模型

Java的内存模型对于多线程来说很简单,Java定义了主内存和共享内存;所有的变量在主内存中存储,但是每个线程拥有自己的工作内存,当线程需要对变量进行 *** 作的时候需要将变量拷贝到自己的工作内存中,对变量 *** 作完成之后再同步到主内存中;

那么Java中的线程到底是一个什么样的概念呢?

Java线程的实现

线程的实现说到底离不开 *** 作系统底层;而Java只是提供了在不同硬件平台下和 *** 作系统中对线程 *** 作的统一处理;

主流的 *** 作系统实现线程有三种方式_

  1. 使用内核线程实现
    所谓的内核线程就是 *** 作系统直接支持的线程,线程的调度和切换都由 *** 作系统内核来完成;
  2. 使用用户线程实现
    用户线程区别于内核线程;这个怎么理解呢,我们知道 *** 作系统为进程分配资源,而线程是CPU调度来执行任务的最小单位,有些 *** 作系统本身支持多线程,但是我们在编写代码的时候可以自己来使用进程的资源,也就是说,用户线程是由用户自己实现的线程,这在底层当然也是需要 *** 作系统的线程来支持的,但是在一定程度上可以避免经常转换到内核态,有些情况下的线程切换可以由用户自己来完成,
  3. 混合实现
    这就不必多说了

Java中的线程实现在Windows和Linux中是使用第一种方式实现的,也就是说Java的一个线程对应的就是 *** 作系统的一个内核线程.

然后我们看一下Java中线程的生命周期是怎样的,或者说Java中定义了线程的哪些状态;

Java线程的生命周期

Java中的线程状态定义在state枚举类中,首先来看一下state的代码,一共定义了

  1. NEW(新建)     
  2. RUNNABLE(就绪)
  3. BLOCKED(阻塞)
  4. WAITING(等待)
  5. TIMED WAITING(计时等待),
  6. TERMINATED(结束)

五种状态,这五种状态很好理解;调用相应的API可以切换不同的状态_

然后我们看一下Java中是如何进行线程调度的,也是说多线程环境下,线程在这些状态中是如何进行切换的;

Java线程调度

线程调度是系统为线程分配处理器使用权的过程;

线程调度方式主要有两种:

  1. 协同式调度
    协同式调度线程的使用时间由线程本身来控制,这种方式很不稳定,容易由于线程死锁导致系统奔溃
  2. 抢占式调度
    抢占式调度每个线程的使用时间由系统来分配执行时间,Java中使用的就是抢占式调度,在抢占式调度的情况下,可以通过设置线程优先级来提高线程被系统使用的时间;
线程安全

然后看一下Java中线程安全的一些概念,这里是多线程的核心内容,多线程环境下最重要的是保证数据访问的同步,同步方式有三种:

  1. 互斥同步
  2. 非阻塞同步
  3. 无同步方案

首先看一下互斥同步方案:

synchronized同步方案是Java中最常用的互斥同步方法;synchronized关键字在经过编译以后,会在同步块前后分别形成monitorenter和monitorexit两个字节码指令,这两个字节码指令都需要一个对象作为参数来指明要锁定的对象;

另外一个就是ReentrantLock,相比Synchronized有以下三个不同:

  1. 等待可中断
  2. 公平锁
  3. 锁绑定多个条件

阻塞同步的缺点-------重量级,无论多线程是否会对共享数据出现竞争,都要进行加锁,用户/核心态转换,维护锁计数器,检查是否有被阻塞的线程等;

然后非阻塞同步,所谓的非阻塞同步就是CAS *** 作,

锁优化

使用互斥锁开销很大,程序中很多情况 下存在同步代码但是实际上不会出现竞争情况,所以对锁进行优化是十分有必要的;

JVM中对锁进行优化的几种方式:

  1. 自旋,自适应性自旋
  2. 锁消除
  3. 锁粗化
  4. 轻量级锁
  5. 偏向锁

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4690770.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-07
下一篇 2022-11-07

发表评论

登录后才能评论

评论列表(0条)

保存