多线程
文章平均质量分 90
whisper-h
轻舟过万重
展开
-
【JAVAEE】使用wait()方法和notify()方法解决线程不安全中的有序性问题
由于线程之间是抢占式执行的,因此线程之间执行的先后顺序难以预知。但是在实际开发中有时候我们希望合理的协调多个线程之间的执行先后顺序。完成这个协调工作,主要涉及三个方法。:让当前线程进入等待状态:唤醒在当前对象上等待的线程wait()方法,notify()方法和notifyAll()方法都是Object类的方法。原创 2023-05-08 18:03:52 · 398 阅读 · 4 评论 -
【JAVAEE】单例模式的介绍及实现(懒汉模式和饿汉模式)
1与3是强相关的执行过程,2是一个单独的过程,所以编译或者CPU就有可能进行指令重排序,使程序执行过程变1,3,2.。每一次调用getInstance()方法的时候,都需要进行锁竞争,再进行判断,而锁竞争是非常耗费系统资源的。②用static修饰的变量(static修饰的变量是类的成员变量,所有实例对象,访问的都是同一个成员变量)既然是单例,那么通过new的方法去获取对象是有歧义的,不能让外部去new这个对象。发现获取到了不同的对象,并不符合我们的预期,也就是说出现了线程不安全的现象。原创 2023-05-11 15:55:41 · 523 阅读 · 2 评论 -
【JAVAEE】常见的锁策略
CAS:全程Compare and swap,字面意思“比较并交换”,一个CAS涉及到以下操作:我们假设内存中的原数据V,旧的预期值A,需要修改的新值B1.比较A与V是否相等(比较)2.如果比较相等,将B写入V(交换)3.返回操作是否成功用期望值与内存中的值比较,如果内存中的值与期望值相等,那么用swapValue覆盖内存中的值,如果期望值与内存中的值不等那么什么也不做。原创 2023-05-12 20:23:53 · 448 阅读 · 1 评论 -
【JAVAEE】JUC(java.util.concurrent)的常见类
Callable是一个interface。相当于把线程封装了一个“返回值”,方便程序员借助多线程的方式计算得出结果。Callable是创建线程的一种的方式,与Runnable类似。当你的任务需要返回值时,用Callable比较好。原创 2023-05-16 20:12:19 · 599 阅读 · 4 评论 -
【JAVAEE】使用synchronized关键字和volatile关键字解决线程安全问题中的原子性,内存可见性和有序性问题
synchronized,volatile解决线程不安全问题原创 2023-05-08 13:35:30 · 612 阅读 · 5 评论 -
【JAVAEE】创建线程的方式及线程的常用方法
Java使用代表线程,所有的线程对象都必须是Thread类或其子类的实例。这里有四种方式可以实现Java创建线程:1.继承Thread类并重写run()方法2.实现Runnable接口并重写run()方法3.通过匿名内部类的方式创建Thread和实现Runnable4.通过lambda表达式来实现一个线程。原创 2023-05-05 14:27:29 · 878 阅读 · 4 评论 -
【JAVAEE】线程池基础知识⭐
在JDBC编程中,通过DataSource获取Connection连接的时候就已经用到了池的概念,当Java程序需要数据库连接的时候就从池中拿一个空闲的连接对象给Java程序,Java程序用完了连接之后就会返回给连接池。线程池就是在池中放的是线程本身,当程序启动的时候就创建出若干个线程,如果有任务就处理,没有任务就等待。线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。原创 2023-05-12 17:11:07 · 760 阅读 · 1 评论 -
【JAVAEE】多线程带来的风险---线程不安全的原因
它本身只是一个抽象的概念,并不真实存在,它描述的是一种规则或规范,是和多线程相关的一组规范。需要每个JVM 的实现都要遵守这样的规范,有了JMM规范的保障,并发程序运行在不同的虚拟机上时,得到的程序结果才是安全可靠可信赖的。情况①:t1先LOAD进内存中,这时CPU把这个线程调度走了,t2开始执行指令,t2执行完之后,又继续t1的执行。⭐主内存:指的是硬件的内存条,进程在启动的时候会申请一些资源,包括内存资源,用来保存一些变量。即:指令在特殊情况下会打乱顺序,如上述的例子,并不是按程序员的预期去执行的。原创 2023-05-06 22:19:36 · 276 阅读 · 0 评论 -
【JAVAEE】阻塞队列的实现
生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取。而这里,生产者就是擀皮的人,消费者使包饺子的人,放饺子皮的地方是一个交易场所,用阻塞队列来是实现。在流量激增的时候用消息队列缓冲,在流量减少的时候,把消息队列中存储的消息一点一点的消费。在流量激增的时候用消息队列缓冲,在流量减少的时候,把消息队列中存储的信息一点一点消费。1.实现一个普通队列,底层用了两种数据结构,一个是链表,一个是循环数组。原创 2023-05-11 22:33:39 · 425 阅读 · 1 评论 -
【JAVAEE】进程和线程
每个应用程序运行于现代操作系统之上时,操作系统会提供一种抽象,好像系统上只有这个程序在运行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一。进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程。在操作系统内部,进程又是操作系统进行资源分配的基本单位。每一个运行起来的程序,操作系统都会以进程的形式把它管理起来。当进程启动时:1.申请内存2.申请文件资源3.将PCB加入到链表中。原创 2023-05-03 16:17:11 · 776 阅读 · 4 评论 -
【JAVAEE】线程安全的集合类及死锁
这里有一个代码示例:定义一个普通的集合类,通过多线程同时对这个集合类进行add操作,并打印集合。却抛出了异常,这是一个并发修改异常,也就是说在多线程环境下使用了线程不安全的集合类。那么在多线程环境下如何使用线程安全的集合类?原创 2023-05-17 16:55:20 · 642 阅读 · 2 评论