资讯专栏INFORMATION COLUMN

java高并发之从零到放弃(一)

luoyibu / 196人阅读

摘要:今天就先到这里,大家可以看看这些内容的拓展记得点关注看更新,谢谢阅读

前言

这是一个长篇博客,希望大家关注我并且一起学习java高并发
废话不多说,直接开始

并行和并发

并行:多个线程同时处理多个任务
并发:多个线程处理同个任务,不一定要同时

下面用图来描述并行和并发的区别:
(实现和虚线表示两个不同的线程)

临界区

是受保护的资源,可以被多个线程使用,但是每次只能有一个线程可以使用它

死锁,饥饿,活锁

死锁
因为有些资源的彼此交叉使用,大家都阻塞了线程,所有关于这个资源的线程全部无法工作
饥饿
一个资源被高优先级别的线程不断抢占着,导致低优先级的线程无法工作
某一个线程一致占着资源不放,导致需要这个资源的线程无法正常工作
活锁
多个线程都主动将资源释放给他人使用,就会出现资源不断在两个线程中跳动,而没有一个线程可以正常执行

JMM(java内存模型)

在并行程序中,就是int i =1都变得及其复杂

下面来看下JMM的三个特性

1. 原子性

和数据库的原子性一样,是指一个操作是不可中断的,即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其它线程干扰

2. 可见性

当一个线程修改了某个共享的值,其它线程是否立即知道这个修改。这个问题在串行程序中是没有的
在并行中实现可见性需要满足以下两个条件:

1.线程修改后的共享变量的值能够及时从工作内存刷新到主内存中
2.其他线程能够及时把共享变量的最新值从主内存更新到自己的工作内存中

因此synchronized实现了可见性和原子性:
对于synchronized的操作JMM有两条规定:

1.线程解锁前,必须把共享变量的最新值刷新到主内存
2.线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需从主内存中重新读取最新的值(加锁与解锁需要同一把锁)

3.有序性

对于串行程序来说,按照顺序进行任务是必然的,但是在并行中却不一样了
比如1号线程要执行两个变量的赋值,但是第一个变量上了锁,要等待解锁,那么它可能就会先对第二个变量进行赋值(这就是指令重排,是jmm特性,可以提高性能)

这时候2号线程去调用一号线程的第一个变量,但1号线程还没有来得及对它赋值,那么这时候就没有保证有序性了。那么为了保证有序性就要用到volatile关键字。

今天就先到这里,大家可以看看这些内容的拓展
记得点关注看更新,谢谢阅读

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68058.html

相关文章

  • java并发之从零到放弃(二)

    摘要:可以用代替可以用代替定义的对象的值是不可变的今天就先到这里,大家可以看看这些内容的拓展记得点关注看更新,谢谢阅读 前言 java高并发第二篇讲的是java线程的基础依旧不多说废话 线程和进程 进程是操作系统运行的基础,是一个程序运行的实体,windows上打开任务管理器就能看到进程线程是轻量级的进程,是程序执行的最小单位,是在进程这个容器下进行的 线程基本操作 新建一个线程类有两种方式...

    cloud 评论0 收藏0
  • java并发之从零到放弃(三)

    摘要:前言今天讲的多线程的同步控制直接进入正题重入锁重入锁可以完全代替,它需要类来实现下面用一个简单的例子来实现重入锁以上代码打印出来的是,可以说明也实现了线程同步它相比更加灵活,因为重入锁实现了用户自己加锁,自己释放锁记得一定要释放,不然其他线 前言 今天讲的多线程的同步控制直接进入正题 ReentrantLock重入锁 重入锁可以完全代替synchronized,它需要java.util...

    FrozenMap 评论0 收藏0
  • java并发之从零到放弃(四)

    摘要:前言本篇主要讲解如何去优化锁机制或者克服多线程因为锁可导致性能下降的问题线程变量有这样一个场景,前面是一大桶水,个人去喝水,为了保证线程安全,我们要在杯子上加锁导致大家轮着排队喝水,因为加了锁的杯子是同步的,只能有一个人拿着这个唯一的杯子喝 前言 本篇主要讲解如何去优化锁机制或者克服多线程因为锁可导致性能下降的问题 ThreadLocal线程变量 有这样一个场景,前面是一大桶水,10个...

    Alex 评论0 收藏0
  • java并发之从零到放弃(五)

    摘要:前言这篇主要来讲解多线程中一个非常经典的设计模式包括它的基础到拓展希望大家能够有所收获生产者消费者模式简述此设计模式中主要分两类线程生产者线程和消费者线程生产者提供数据和任务消费者处理数据和任务该模式的核心就是数据和任务的交互点共享内存缓 前言 这篇主要来讲解多线程中一个非常经典的设计模式包括它的基础到拓展希望大家能够有所收获 生产者-消费者模式简述 此设计模式中主要分两类线程:生产者...

    meislzhua 评论0 收藏0
  • 前端从零开始系列

    摘要:只有动手,你才能真的理解作者的构思的巧妙只有动手,你才能真正掌握一门技术持续更新中项目地址求求求源码系列跟一起学如何写函数库中高级前端面试手写代码无敌秘籍如何用不到行代码写一款属于自己的类库原理讲解实现一个对象遵循规范实战手摸手,带你用撸 Do it yourself!!! 只有动手,你才能真的理解作者的构思的巧妙 只有动手,你才能真正掌握一门技术 持续更新中…… 项目地址 https...

    Youngdze 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<