首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏路人甲Java

    java并发系列-第2天:并发级别

    这是java并发系列第2篇文章,一个月,咱们一起啃下java并发,欢迎留言打卡,一起坚持一个月,拿下java并发。 由于临界区的存在,多线程之间的并发必须受到控制。 根据控制并发的策略,我们可以把并发的级别分为阻塞、无饥饿、无障碍、无锁、无等待几种。 阻塞 一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执行。 图1.7中显示了非公平锁与公平锁两种情况(五角星表示优先级线程)。对于非公平锁来说,系统允许优先级的线程插队。这样有可能导致低优先级线程产生饥饿。 应该比较熟悉,表中需要一个字段version(版本号),每次更新数据version+1,更新的时候将版本号作为条件进行更新,根据更新影响的行数判断更新是否成功,伪代码如下: 1.查询数据,此时版本号为w_v 2. java并发系列目录: 1.java并发系列-第1天:必须知道的几个概念 希望您能把这篇文章分享给更多的朋友,让它帮助更多的人。帮助他人,快乐自己,最后,感谢您的阅读。微信扫码入群一起交流。

    1K30发布于 2019-12-10
  • 来自专栏卯金刀GG

    并发Java2):多线程基础

    如果使用多进程,那么并发数相对来说不会很高。而线程是更细小的调度单元,更加轻量级,所以线程会较为广泛的用于并发设计。 在Java当中线程的概念和操作系统级别线程的概念是类似的。 事实上,Jvm将会把Java中的线程映射到操作系统的线程区。 2. 线程的基本操作 2.1 线程状态图 ? 上图是Java中线程的基本操作。 当new出一个线程时,其实线程并没有工作。 如果不了解Java的中断机制,这样的一种解释极容易造成误解,认为调用了线程的interrupt方法就一定会中断线程。 其实,Java的中断是一种协作机制。 当一个Java应用内,所有非守护进程都结束时,Java虚拟机就会自然退出。 此前有写过一篇python中如何实现,查看这里。 而Java中变成守护进程就相对简单了。 当然并不一定是优先级一定先完成。再多次运行后发现,优先级完成的概率比较大,但是低优先级还是有可能先完成的。 5.

    68620发布于 2019-07-25
  • 来自专栏java一日一条

    Java 并发综合

    曾经,我在面试Java研发实习生时最常听到的一句话就是: 搞Java怎么能不学并发呢? 没错,真的是经过了面试官的无数鄙视,我才知道Java并发编程在Java语言中的重要性。 并发编程 Java中如何创建一个线程 从面相接口的角度上讲,实际上只有一种方法实现Runable接口;但Thread类为线程操作提供了更多的支持,所以通常做法是实现Runable接口,实例化并传入Thread 每个Segment持有一个锁,通过分段加锁的方式,既实现了线程安全,又兼顾了性能 Java中有哪些实现并发编程的方法 要从最简单的答起,业界最常用的是重点,有新意就放在最后。 1. synchronized关键字 2. 使用继承自Object类的wait、notify、notifyAll方法 3. 手动使用Lock实现基于锁的并发控制 7. 手动使用Condition或AQS实现基于条件队列的并发控制 8. 使用CAS和SPIN等实现非阻塞的并发控制 使用不变类 9.

    1.2K30发布于 2018-09-14
  • 来自专栏李鹏的专栏

    JAVA 并发设计

    同步和异步通常用来形容一次方法调用,同步方法,调用者必须等到方法调用返回后,才能继续后续的行为,异步方法调用会立即返回,调用者就可以继续后续的操作 [img5a03f5e9a3f6f.jpg] 二、并发和并行 并发和并行都可以表示两个或多个任务一起执行,但偏重点点不同,并发偏重于多个任务交替执行,而多个任务之间有可能还是串行的。 四、线程的状态 [img5a03f5fa2aefd.jpg] 线程的状态 1、线程的启动是调用start()方法,而不是run()方法。 2、线程的终止、不用stop()是因为stop()方法太过暴力,强行把执行到一半的线程终止,可能会引起数据不一致的问题,一般我们定义一个线程终止的方法,告知线程何时停止即可。

    1.8K00发布于 2017-11-09
  • 来自专栏Linyb极客之路

    杂谈Java并发

    常见的提高高并发下访问的效率的手段 首先要了解并发的的瓶颈在哪里? 2、负载均衡,前置代理服务器nginx、apache等等 3、数据库查询优化,读写分离,分表等等 最后复制一些在并发下面需要常常需要处理的内容: 1、尽量使用缓存,包括用户缓存 java并发,如何解决,什么方式解决 之前我将并发的解决方法误认为是线程或者是队列可以解决,因为并发的时候是有很多用户在访问,导致出现系统数据不正确、丢失数据现象,所以想到 的是用队列解决,其实队列解决的方式也可以处理 总 结:其实我们在开发中都很少考虑这种问题,直接都是先将功能实现,当一个程序员在干到1到2年,就会感觉光实现功能不是最主要的,安全性能、质量等等才是 一个开发人员最该关心的。今天我所说的是并发。 我的解决思路是: 1、采用分布式应用设计 2、分布式缓存数据库 3、代码优化 Java并发的例子 具体情况是这样: 通过java和数据库,自己实现序列自动增长。

    2.1K50发布于 2018-07-26
  • 来自专栏JAVA高级架构

    Java 并发综合

    曾经,我在面试Java研发实习生时最常听到的一句话就是: 搞Java怎么能不学并发呢? 没错,真的是经过了面试官的无数鄙视,我才知道Java并发编程在Java语言中的重要性。 并发编程 Java中如何创建一个线程 从面相接口的角度上讲,实际上只有一种方法实现Runable接口;但Thread类为线程操作提供了更多的支持,所以通常做法是实现Runable接口,实例化并传入Thread 每个Segment持有一个锁,通过分段加锁的方式,既实现了线程安全,又兼顾了性能 Java中有哪些实现并发编程的方法 要从最简单的答起,业界最常用的是重点,有新意就放在最后。 1. synchronized关键字 2. 使用继承自Object类的wait、notify、notifyAll方法 3. 手动使用Lock实现基于锁的并发控制 7. 手动使用Condition或AQS实现基于条件队列的并发控制 8. 使用CAS和SPIN等实现非阻塞的并发控制 使用不变类 9.

    1.2K60发布于 2018-04-19
  • 来自专栏软件设计

    Java并发Java内存模型

    2 并发编程的三大问题 原子性问题:不可中断的一系列动作,不会被线程调度机制打断,也不会被CPU响应中断打断。 如果CPU1修改了数据a,那么在CPU1中这一行修改为M状态,CPU2中这一行修改为I无效状态。如果CPU2再次读写数据a,需要CPU1将这一行刷回主存,CPU2再次从主存读取,确保可见性。 另外,JMM定义了一套抽象指令,由JVM编译为具体的机器指令,用于屏蔽不同硬件的差异性,保证Java程序在不同平台下对内存访问是一致的。 图片 本质上,这些规则是解决各种场景在并发时的可见性问题: 程序顺序规则:一个线程中的每个操作都应该happens-before该线程任何后续操作。即线程内每个操作的结果对该线程所有后续操作都可见。 每个Java对象都有一个监视器对象同生共死,获取锁失败的线程会进入监视器对象的阻塞队列等待被唤醒。

    1.2K30编辑于 2023-03-01
  • 来自专栏JVMGC

    Java并发之BlockingQueue

    BlockingQueue实现了java.util.Collection接口,我们可以使用remove(x)来删除任意一个元素,但是这类操作并不高效,所以尽量在少数场合使用,比如一条消息已经入队,但是需要取消操作的时候 无界队列,并不是大小不限制,只是它的大小是Integer.MAX_VALUE,即int类型能表示的最大值(2的31次方)-1 BlockingQueue具体实现类 ArrayBlockingQueue

    69400发布于 2021-02-10
  • 来自专栏卯金刀GG

    并发Java(1):前言

    1、关于并发的几个重要概念 1.1 同步和异步 首先这里说的同步和异步是指函数/方法调用方面。 ? 1.2 并发和并行 ? 并发和并行在外在表象来说,是差不多的。由图所示,并行则是两个任务同时进行,而并发呢,则是一会做一个任务一会又切换做另一个任务。所以单个cpu是不能做并行的,只能是并发。 活锁,指事物1可以使用资源,但它让其他事物先使用资源;事物2可以使用资源,但它也让其他事物先使用资源,于是两者一直谦让,都无法使用资源。 下面代码是Java中典型的无锁计算代码 无锁在Java中很常见 1 2 3 4 while (! 2.

    90320发布于 2019-07-25
  • 来自专栏专注于java领域技术分析

    Java 实现并发秒杀

    Dao层和对应的实体 ① Seckill.java packagecom.force4us.entity;importorg.springframework.stereotype.Component; startTime="+ startTime +", endTime="+ endTime +", createTime="+ createTime +'}'; }} ② SuccessKilled.java publicString test(){return"helloworld"; }} (6) list.jsp <%@pagecontentType="text/html;charset=UTF-8"language="<em>java</em> 名称库存开始时间结束时间创建时间详情页${sk.name}${sk.number}详情 (7) details.jsp <%@pagecontentType="text/html;charset=UTF-8"language="<em>java</em> 发送秒杀请求执行秒杀 5.优化: 由于减少库存和购买明细需要在同一事物当中,在次中间会出现网络延迟,GC,缓存,数据库的<em>并发</em>等,所以需要进行优化。

    2.7K10发布于 2020-09-08
  • 来自专栏全栈程序员必看

    Java并发读写文件

    最近在项目中我们遇到了并发的事情,我是这样操作的。利用JavaNIO实现非阻塞式的读写,通过锁机制完成并发下的文件的操作。

    2.1K31编辑于 2022-08-30
  • 来自专栏别先生

    Java并发编程与并发之线程并发容器

    1、并发容器及安全共享策略总结,并发容器J.U.C(即java.util.concurrent)。J.U.C同步器AQS。 1.1、相比于ArrayList,这个线程不安全的。 1 package com.bie.concurrency.example.concurrent; 2 3 import java.util.Collections; 4 import java.util.List ,并发场景下具有很好的表现。 JUC大大提高了java程序的并发性能,AQS是JUC的核心,AQS重点学习哦,底层使用了双向链表是队列的一种实现。 1 package com.bie.concurrency.example.lock; 2 3 import java.util.Map; 4 import java.util.Set; 5

    1.8K20发布于 2020-02-18
  • 来自专栏全栈程序员必看

    Java并发解决方案

    2.并发的挑战:一定要“快” 我们通常衡量一个Web系统的吞吐率的指标是QPS(Query Per Second,每秒处理请求数),解决每秒数万次的并发场景,这个指标非常关键。 在并发的实际场景下,机器都处于负载的状态,在这个时候平均响应时间会被大大增加。 这是个非常简单的逻辑,但是,在并发的场景下,存在深深的漏洞。 (同文章前面说的场景) 在上面的这个图中,就导致了并发用户B也“抢购成功”,多让一个人获得了商品。这种场景,在并发的情况下非常容易出现。 四、小结 互联网正在高速发展,使用互联网服务的用户越多,并发的场景也变得越来越多。电商秒杀和抢购,是两个比较典型的互联网并发场景。

    1.6K30编辑于 2022-09-04
  • 来自专栏IT技术订阅

    Java并发必学--concurrent包

    "即将到达集合地点1,当前已有" + (cb.getNumberWaiting()+1) + "个到达," + (cb.getNumberWaiting() == 2 当前已有" + (cb.getNumberWaiting()+1) + "个到达," + (cb.getNumberWaiting() == 2 ? 这在长时间内需要高效并发地处理大批量数据的系统中,其对于GC的影响还是存在一定的区别。而在创建ArrayBlockingQueue时,我们还可以控制对象的内部锁是否采用公平锁,默认采用非公平锁。 而LinkedBlockingQueue之所以能够高效的处理并发数据,还因为其对于生产者端和消费者端分别采用了独立的锁来控制数据同步,这也意味着在并发的情况下生产者和消费者可以并行地操作队列中的数据, 以此来提高整个队列的并发性能。

    66010编辑于 2022-06-23
  • 来自专栏卯金刀GG

    并发Java(4):无锁

    并发Java(1):前言中已经提到了无锁的概念,由于在jdk源码中有大量的无锁应用,所以在这里介绍下无锁。 Java当中提供了很多无锁类,下面来介绍下无锁类。 2 无所类的使用 我们已经知道,无锁比阻塞效率要高得多。我们来看看Java是如何实现这些无锁类的。 2.1. return next; } } 假设当前value=1当某线程int current = get()执行后,切换到另一个线程,这个线程将1变成了2, 然后又一个线程将2又变成了1。 package test; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater

    70420发布于 2019-07-26
  • 来自专栏大道七哥

    Java并发之设计模式

    懒汉式: 方法上加synchronized 1 public static synchronized Singleton getInstance() { 2 if (single 至于为什么要volatile关键字, 主要涉及到jdk指令重排, 详见之前的博文: Java内存模型与指令重排 懒汉式: 使用静态内部类 1 public class Singleton { 2 饿汉式 1 public class Singleton1 { 2 private Singleton1() {} 3 private static final Singleton1 如果doOtherThing耗时2s, 则整个函数耗时2s左右. 如果doOtherThing耗时0.2s, 则整个函数耗时取决于RealData.costTime, 即1s左右结束. 1 public class FutureDemo1 { 2 3

    63610发布于 2019-08-23
  • 来自专栏xdecode

    Java并发之设计模式.

    懒汉式: 方法上加synchronized 1 public static synchronized Singleton getInstance() { 2 if (single 由于每次获取示例都要获取锁, 不推荐使用, 性能较差 懒汉式: 使用双检锁 + volatile 1 private volatile Singleton singleton = null; 2 至于为什么要volatile关键字, 主要涉及到jdk指令重排, 详见之前的博文: Java内存模型与指令重排 懒汉式: 使用静态内部类 1 public class Singleton { 2 如果doOtherThing耗时2s, 则整个函数耗时2s左右. 如果doOtherThing耗时0.2s, 则整个函数耗时取决于RealData.costTime, 即1s左右结束. 1 public class FutureDemo1 { 2 3

    69210发布于 2018-08-28
  • 来自专栏软件设计

    Java并发:synchronize底层原理

    一、前置知识 1 Java对象结构 每个Java对象都隐含一把锁,Java内置锁的很多重要信息都放在对象头部,对象头有三个字段: Mark Word,用来存储自身运行时的数据,例如GC标志、哈希码、锁状态等 每次比较锁标志和thread_id,如果符合就表示内置锁偏向该线程,当前持有这把锁,不用去加锁和解锁,直接进入同步代码块,甚至都不用CAS,偏向锁在没有竞争时效率非常Java15之后偏向锁因维护代价大被移除了。 偏向锁主要作用是消除没有竞争时同步原语,降低锁开销。 图片 3 锁膨胀和撤销 当线程1使用完锁,线程2来加锁时,此时锁对象的Mark Word中thread_id指向线程1,线程2发现该锁并不是偏向自己,说明存在锁竞争,流程如下: 检查线程1是否存活,如果挂了 图片 2 演示案例 当线程2竞争锁时,锁会升级为轻量级锁,线程1和线程2公平竞争,Mark Word中thread_id会更新为抢占锁的线程。

    88200编辑于 2023-03-01
  • 来自专栏xdecode

    Java并发之锁优化

    Collections.synchronizedMap 其本质是在读写map操作上都加了锁, 在并发下性能一般. 只要多个修改发生在不同的分区, 他们就可以并发的进行. 把一个整体分成了16个Segment, 最高支持16个线程并发修改.  JDK中各种涉及锁优化的并发类可以看之前的博文: 并发包总结 ThreadLocal 除了控制有限资源访问外, 我们还可以增加资源来保证对象线程安全. 如果想要在并发场合下获取更好的性能, 则可以使用基于CAS的ConcurrentLinkedQueue.  关于无锁, 这边不再赘述, 之前博文已经有所介绍, 具体见: Java并发之无锁与Atomic源码分析

    87340发布于 2018-07-04
  • 来自专栏全栈程序员必看

    java并发下数据入库

    java并发下数据入库 该服务利用线程池并结合缓存类来处理并发下数据入库问题,做到实时数据存入redis和数据批量入库,使用的时候需要修改为自己的业务数据,该模块是根据下面的设置进行并发处理。 2、达到最大批次。 ; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors thread.setName("batch-worker-" + ((BatchWorker) r).batchKey); } return thread; }); } /** * 需要做并发处理的类只需要调用该方法 ; import java.util.LinkedList; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import

    98610编辑于 2022-08-30
领券