草庐IT

并发锁

全部标签

JUC并发编程学习(五)集合类不安全

集合类不安全List不安全单线程情况下集合类和很多其他的类都是安全的,因为同一时间只有一个线程在对他们进行修改,但是如果是多线程情况下,那么集合类就不一定是安全的,可能会出现一条线程正在修改的同时另一条线程启动来对这个集合进行修改,这种情况下就会导致发生并发修改异常(在jdk11的环境下多次测试该代码发现并无问题,但是学习教程中有该异常。原因:线程数量不够)packageorg.example.unsafe;importjava.util.ArrayList;importjava.util.UUID;publicclassTest1{publicstaticvoidmain(String[]a

JUC并发编程学习笔记(六)Callable(简单)

Callable(简单)callable接口和runnable接口类似,都是为了执行另外一条线程而设计的,区别是Runnable不会返回结果也不会抛出异常。1、可以有返回值2、可以抛出异常3、方法不同;run()/call();Runnable实现Runnable接口,重写run方法,无返回值//原线程classRunnableThreadimplementsRunnable{@Overridepublicvoidrun(){}}Callable实现Callable接口,重写call方法,有返回值,可在实现接口时设定//callable线程classCallableThreadimplemen

JUC并发编程学习笔记(三)生产者和消费者问题

生产者和消费者问题synchronized版->wait/notifyjuc版->Lock面试:单例模式、排序算法、生产者和消费者、死锁生产者和消费者问题Synchronized版packageorg.example.pc;publicclassA{publicstaticvoidmain(String[]args){Datedate=newDate();newThread(()->{for(inti=0;i{for(inti=0;i"+number);//通知其他线程,我完成了this.notify();}publicsynchronizedvoiddecrement(){if(number

建立websocket连接并发送和处理数据

服务端1、WebSocket配置类在配置类中一般需要实现“注册WebSocket处理程序”、“Bean注册”。@Configuration@EnableWebSocket//启用WebSocket功能publicclassWebSocketConfigimplementsWebSocketConfigurer{@OverridepublicvoidregisterWebSocketHandlers(WebSocketHandlerRegistryregistry){registry.addHandler(myWebSocketHandler(),"/chat")//将WebSocket处理程序

Java并发编程-volatile

volatile是java虚拟机提供的一种轻量级的同步机制,它有三个重要的特性:保证可见性不保证原子性禁止指令重排要理解这三个特性,就需要对JMM(JAVA内存模型)有一定的了解才行。主要解决的问题:JVM中,每个线程都会存在本地内存,本地内存是公共内存的副本,各个线程的本地内存相互隔离,就会存在一个线程对共享变量做了修改,其他线程没有感知到的情况,从而导致数据不一致一、JMM(JAVA内存模型)JMM是Java虚拟机规范中所定义的一种内存模型,Java内存模型是标准化的,屏蔽掉了底层不同计算机的区别。也就是说,JMM是JVM中定义的一种并发编程的底层模型机制。JMM定义了线程和主内存(可以理

JUC并发编程学习笔记(一)认知进程和线程

进程和线程进程一个程序,如QQ.exe,是程序的集合一个进程往往可以包含多个线程,至少包含一个java默认有两个线程,GC垃圾回收线程和Main线程线程:一个进程中的各个功能java无法真正的开启线程,因为java是运行在虚拟机上的,所以只能通过C++,通过native本地方法调用C++开启线程privatenativevoidstart0();并发、并行并发:多线程操作同一资源cpu单核情况下,通过快速交替模拟多条线程并行:多个线程一起行走只有在cpu多核情况下才可能产生并行,多个线程同时进行,cpu核数决定最大并行量。线程池并发编程的本质就是想要充分利用电脑的cpu资源线程有几个状态jav

Java-并发编程-进阶篇

在上一篇幅中对并发编程进行了简单介绍:并发与并行,进程与线程,以及并发编程的简单代码但是在企业中往往并不能解决实际问题,例如:1.synchronized关键字在企业开发中会大大降低系统的性能,有什么解决方式,或者其他的替代方案2.当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。线程对象在不同的时期有不同的状态,如果不清楚认识,则无法清楚自己的代码出现的问题3.随处可见的newThread();缺少对于线程、以及资源的管理,有什么解决方案?查看资料:https://javaguide.cn/java/concurrent/jmm.html#jmm-是如何抽象线程

JUC并发编程学习笔记(二)Lock锁(重点)

Lock锁(重点)传统的synchronized传统的解决多线程并发导致的一些问题我们会使用synchronized关键字来解决,synchronized的本质就是队列、锁。Lock的实现类有:可重复锁(最常用)、读锁、写锁在创建可重复锁时,可传入boolean类型值来决定该锁是公平锁(先来后到)还是非公平锁(可插队)。三部曲1、创建一个锁Locklock=newReentrantLock(true);2、加锁lock.lock();3、将业务代码块包裹在try{}cath(){}finally{lock.unlock();}中try{if(number>0){System.out.print

JUC并发编程学习笔记(四)8锁现象

8锁现象八锁->就是关于锁的八个问题锁是什么,如何判断锁的是谁对象、class模板深刻理解锁锁的东西无外乎就两样:1、同步方法的调用者,2、Class模板。同一个锁中,只有当前线程资源释放后才会被下一个线程所接手。同步方法的调用者是两个不同的实例时,互不相关。静态同步方法(static)锁的是整个Class模板,和同步方法的调用者也不是同一个锁;切Class模板在Java程序中唯一。代码示例1、浅浅理解锁的作用同一把锁中根据执行先后释放资源,保证一个资源的使用顺序packageorg.example.phone;importjava.util.concurrent.TimeUnit;publi

ruby-on-rails - 并发和 Mongoid

我目前正在尝试使用Rails和Mongoid开发一个简单的基于网络的游戏。我遇到了一些不确定如何解决的并发问题。问题是我不确定如何在Mongoid中自动进行检查并根据它采取行动。这是Controller代码相关部分的示例,让您了解我正在尝试做什么:battle=current_user.battlebattle.submitted=truebattle.saveifBattle.where(opponent:current_user._id,submitted:true,resolving:false).any?battle.update_attribute(:resolving,tr