火狐体育官方网站

火狐体育官方网站入口

联系人:林总

手机:13397081699

地址:青云谱区青云谱农场区华东国际工业博览城12栋C309号、C297号


Java多线程超级详解(看这篇就足够了)
产品介绍

  很多人都对其中的一些概念不够明确,如同步、并发等等,让我们先建立一个数据字典,以免产生误会。

  Java中的同步指的是通过人为的控制和调度,保证共享资源的多线程访问成为线程安全,来保证结果的准确。

  比如:synchronized关键字,在保证结果准确的同时,提高性能,线程安全的优先级高于性能。

  并发往往在场景中有公用的资源,那么针对这个公用的资源往往产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。

  新建状态 :当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时仅由JVM为其分配内存,并初始化其成员变量的值

  就绪状态 :当线程对象调用了start方法之后,该线程处于就绪状态。Java虚拟机会为其创建方法调用栈和程序计数器,等待调度运行

  运行状态 :如果处于就绪状态的线程获得了CPU,开始执行run方法的线程执行体,则该线程处于运行状态

  死亡状态 :线程在run方法执行结束后进入死亡状态。此外,如果线程执行了interrupt或stop方法,那么它也会以异常退出的方式进入死亡状态。

  在线程a中调用线程b的join, 此时线程a进入阻塞状态, 知道线程b完全执行完以后, 线程a才结束阻塞状态

  2) 关于是否释放同步监视器:如果两个方法都使用在同步代码块呵呵同步方法中,sleep不会释放锁,wait会释放锁。

  一旦执行此方法,将会唤醒被wait的一个线程。如果有多个线程被wait,就唤醒优先度最高的。

  从上图可以看出,提交任务之后,首先会尝试着交给核心线程池中的线程来执行,但是必定核心线程池中的线程数有限,所以必须要由任务队列来做一个缓存,先将任务放队列中缓存,然后等待线程去执行。

  最后,由于任务太多,队列也满了,这个时候线程池中剩下的线程就会启动来帮助核心线程池执行任务。

  下图是synchronized同步代码块反编译后的截图,可以很清楚的看见monitor的调用。

  在单线个操作都不会出现问题,但是在多线程环境中,如果不通过加锁操作,往往很可能会出现意料之外的值。在java中可以通过synchronized或者ReentrantLock来保证原子性。

  可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即得到这个修改的值。

  如上图所示,每个线程都有自己的工作内存,工作内存和主存间要通过store和load进行交互。

  为了解决多线程的可见性问题,java提供了volatile关键字,当一个共享变量被volatile修饰时,他会保证修改的值会立即更新到主存,当有其他线程需要读取时,他会去主存中读取新值,而普通共享变量不能保证其可见性,因为变量被修改后刷回到主存的时间是不确定的。

  线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。

  两个线程各自持有不同的锁,然后各自试图获取对方手里的锁,造成了双方无限等待下去,这就是死锁。

  CPU是很宝贵的资源,速度也非常快,为了保证均衡,通常会给不同的线程分配时间片,当CPU从一个线程切换到另外一个线程的时候,CPU需要保存当前线程的本地数据,程序指针等状态,并加载下一个要执行的线程的本地数据,程序指针等,这个切换称之为上下文切换。

火狐体育官方网站| 火狐体育官方网站入口| 新闻中心| 产品中心| 火狐体育官方网站网址下载| 工程案例| 网站地图|