Java 多线程实现(一)

多线程的目的

提到多线程就只有一个目录,更好的利用CPU资源,我们让CPU同时处理多个任务,缩短计算和处理时间。

在实现多线程之前,首先了解一个下多线程的一些概念:

多线程:在一个进程中,运行不止一个线程

并行:多个CPU 实例或者多台计算机同时运行一段处理逻辑,该中情况是真正的在时间上同时值行哦

并发:通过CPU的调度算法,让用户看上去好像是在并行,但是实际上CPU并不是真正的同时,下面引用网友一张图:


线程安全:线程安全一般是对变量或者一段代码而言,指在并发的情况下,该代码被多线程使用,但是线程的调度顺序并不会应用最终结果,我们编写程序只需要考虑系统的内存和CPU是否够用即可,反过来,非线程安全即使线程的先后值行可能造成不一样的结果

同步:在Java中的同步指的是通过人为的控制程序值行,保证共同资源来对多线程访问是线程安全的,一般同步有多种实现比如 synchronized 关键字还有CAS算法等

线程的状态

线程从开始到结果经过了如下几种状态:

NEW:新建一个线程,该线程还没有开始运行

RUNNABLE:线程在JAVA虚拟机中运行,但是在等待操作系统资源,比如CPU资源

BLOCKED:线程被阻塞,在等待监视器锁的释放进入同步方法

WAITING:线程等待,该状态是当前线程等待另一个线程值行一个特定的程序

TIMED_WAITING:和WAITING类型,不过该等待会指定一个特定时间

TERMINATED:进程运行完成

以上状态可以参考JAVA 源码中对进程状态的描述:Thread.State


进程状态间转换

JAVA中锁是监视器提供了必要的支持。逻辑上锁是对象内存堆中头部的一部分数据,JVM中每个对象都拥有一个锁(互斥锁),任何程序都可以使用它来协调对对象的访问,如果任何程序想访问该对象实例,则必须获取该对象的锁(在锁中有区域设置),其他线程试图访问该对象必须等到获取该锁的实例释放锁(改变锁的标记)

锁用来保护代码片段,任何时刻只能有一个线程执行被保护的代码,如果一个方法使用synchronized关键字声明,那么对象的锁将保护整个方法

监视器

监视器可以看作是一个特殊的房间,该房间中有一些数据和代码,但是一次只能有一个人(消费者)使用该房间,如果想进入该房间,必须到大厅(Entry Set)去排队,调度程序会使用某种标准比如FIFO,从大厅中选择一个消费者(线程)进入特殊房间,如果这个线程因为某种原因被挂起,它将会被调度程序安排的等待房间(Wait Set),并经过一段时间之后重新分配到特殊房间。


简单来说:监视器就是用来监视线程进入特殊房间,他确保同一时间只能有一个线程可以访问特殊房间中的数据和代码。


wait/notify必须存在于synchronized中,并且,这三个关键字针对同一个监视器

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 该文章转自:http://blog.csdn.net/evankaka/article/details/44153...
    加来依蓝阅读 12,077评论 3 87
  • 一、进程和线程 进程 进程就是一个执行中的程序实例,每个进程都有自己独立的一块内存空间,一个进程中可以有多个线程。...
    阿敏其人阅读 7,402评论 0 13
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 8,094评论 1 18
  • 写在前面的话: 这篇博客是我从这里“转载”的,为什么转载两个字加“”呢?因为这绝不是简单的复制粘贴,我花了五六个小...
    SmartSean阅读 10,238评论 12 45
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 7,200评论 1 15

友情链接更多精彩内容