![](https://img-blog.csdnimg.cn/20210219230545721.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java线程
多线程
奔跑的扫地僧
在代码的世界中,知识需要分享,代码需要open source,世界才能大一统。世界本没有界限,人类的思维限定了国界。
展开
-
创建线程的第三种方式(获取线程执行的结果)
我的多线程专栏的博客写了常见的创建线程的两种方式,继承Thread类或者实现Runnable接口这里再写一下第三种方式实现Callable接口。这里我们用FutureTask类来承载实现Callable接口的线程类。FutureTask类继承RunnableFuture接口,RunnableFuture又继承Runnable和Future接口。废话不多说,开干。先我们实现自己需要的实现Callable接口的类:import java.util.concurrent.Callable;原创 2022-05-12 10:02:32 · 177 阅读 · 0 评论 -
浅谈高并发场景开发中涉及的锁
我们在实际开发中,除了在互联网或者电商公司可能会遇到高并发的场景,其他公司大概率是没有高并发场景的。以我个人的经历,在金融公司的一线,一般的单个应用接口锁支持的并发在20左右,然后运维部署多台机器,例如20台,前端再用F5或者nginx做个负载均衡,并发量就支持在400左右。这里谈一谈,我们解决高并发的思路。高并发最重要的事:资源不能超支。(例如:商品超卖)第一境界:采用悲观锁。悲观锁,大家应该都无数次听过这个名词了,不要以为是什么高大上的概念。其实在数据库层的实现就是 select pro原创 2021-11-06 10:49:53 · 370 阅读 · 0 评论 -
JAVA中悲观锁与乐观锁
悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿 数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资 源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线 程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁 等,读锁,写锁等,都是在做操作之前先上锁。Java 中 synchronized 和 ReentrantLock 等独占锁就是悲观锁思想的实现乐观锁 总是假设最好的情况,每次去拿数据的时候都认原创 2021-08-13 15:02:42 · 270 阅读 · 0 评论 -
CompletableFuture异步调用示例
异步编程从1.5Future到FutureTask在再到CompletableFuture,是一种进步 如下展示一个自己尝试的样例:package futuretest;import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;import java.util.function.Function;import java.util.function.Supplier;原创 2021-07-28 18:16:26 · 203 阅读 · 0 评论 -
计算机缓存结构理解
说到缓存,从大的方向上,我们分为硬件和软件。我们在平时的开发中用到的,redis、H2等内存数据库做缓存是在软件编程层面。另一方面,我们从存储器的层次结构来看计算机。原创 2021-06-20 19:59:00 · 296 阅读 · 0 评论 -
CompletableFuture的使用
场景就是,异步查询各家商店的书价格,然后返回。第一步:首先定义一个shop类商店。import java.util.Random;import java.util.concurrent.CompletableFuture;import java.util.concurrent.Future;public class Shop { String name; public double getPrice(){ return calcPrice(); //模拟原创 2021-05-25 11:06:45 · 176 阅读 · 0 评论 -
Future异步编程样例
Java5引入了Future接口。对它的理解,就一句话:采用Future接口可以对异步计算进行建模,返回一个指向执行结果的引用,运算结束后,调用可以通过该引用访问执行的结果。异步调用?那岂不是和Thread差不多?Future的优势在于,通常你只需要将耗时的操作封装在一个Callable对象中,再将它提交给ExecutorService 直接撸代码,如下:import java.util.concurrent.*;public class FutureDemo { publ..原创 2021-05-25 06:53:24 · 118 阅读 · 0 评论 -
JUC包中的Exchanger类
Exchanger类用于两个线程之间的信息交换。举一个现场的例子:import java.util.concurrent.Exchanger;public class ExchangerTest { static Exchanger<String> exchanger = new Exchanger<>(); public static void main(String[] args) { new Thread(()->{原创 2021-05-13 22:55:09 · 158 阅读 · 0 评论 -
JUC的ReadWriteLock示例
ReadWriteLock 可以实现的是可以多线程读,然后写线程不与读线程冲突import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantLock;import java.util.concurrent.locks.ReentrantReadWriteLock;public class Test原创 2021-05-13 09:32:24 · 75 阅读 · 0 评论 -
JUC 包中的countDownLatch介绍示例
CountDownLatch是JDK提供的一个同步工具,它可以让一个或多个线程等待,一直等到其他线程中执行完成一组操作。提问:CountDownLatch有哪些常用的方法?答:有countDown方法和await方法,CountDownLatch在初始化时,需要指定用给定一个整数作为计数器。当调用countDown方法时,计数器会被减1;当调用await方法时,如果计数器大于0时,线程会被阻塞,一直到计数器被countDown方法减到0时,线程才会继续执行。计数器是无法重置的,当计数器被减到0时,调原创 2021-05-12 22:23:38 · 121 阅读 · 0 评论 -
ReentrantLock的公平锁和非公平锁代码
公平锁,即为哪个先到,哪个先排队就哪个执行。示例代码如下:public class ReentrantLockTest extends Thread { private static ReentrantLock lock = new ReentrantLock(true);//公平锁 @Override public void run() { for (int i = 0; i < 100; i++) { lock.lock(原创 2021-05-12 08:48:33 · 125 阅读 · 0 评论 -
java线程中CAS的写法
举个例子,场景:循环启用3条线程,打印计数信息 。第一种:传统的错误写法://循环启用3条线程,打印计数信息 错误示例public class JUC { static Integer num = 0; public static void main(String[] args) { for (int i = 0; i < 3; i++) { Thread t = new Thread(new Runnable() {原创 2021-05-07 18:34:38 · 226 阅读 · 0 评论 -
java多线程常见问题分享---volatile关键字总结
无须多言,直接上图原创 2021-03-28 10:22:35 · 79 阅读 · 0 评论 -
线程池代码分析
分析线程池的源码之前,先要知道线程池的作用,以下这几点引用自《码出高效-Java开发手册》:1、利用线程池管理并复用线程、控制最大并发数等。2、实现任务线程队列缓存策略和拒绝机制。3、实现某些与时间相关的功能,如定时执行、周期执行等。4、隔离线程环境。比如,交易服务和搜索服务在同一台服务器上,分别开启两个线程池,交易线程的资源消耗明显要大;因此,通过配置独立的线程池 ,将较慢的交易服务与搜索服务隔离开,避免各服务线程相互影响。 那么自然我们使用线程池的目的也就很显然了:1、线程.原创 2021-01-31 22:30:16 · 214 阅读 · 0 评论 -
java中线程的知识09---公平锁和非公平锁
Java中Lock分为公平锁与非公平锁两种。公平锁表示线程获取锁的顺序是按照 加锁的顺序来分配的,也就是先来先得。而非公平锁就是一种获取锁的抢占机制 ,是随机获得锁,与公平锁不一样的是先来的不一定先得到锁,这种方式可能会造成某些线程一直都拿不到锁,结果也就是不公平的。在公平的锁中,如果有另一个线程持有锁或者有其他线程在等待队列中等待这个所,那么新发出的请求的线程将被放入到队列中。而非公平锁上,只有当锁被某个线程持有时,新发出请求的线程才会被放入队列中(此时和公平锁是一样的)。所以,它们的差别在于非公平锁会有原创 2021-01-30 14:05:00 · 124 阅读 · 0 评论 -
java中线程的知识08---利用Reentrantlock实现线程的等待和唤醒
我在《java中线程的知识05》中写过线程的等待和唤醒,关键字synchronized与wait/notify或notifyAll方法想结合可以实现等待/通知模式,类RentrantLock也可以实现同样的功能,但需要借助Condition对象。Condition类是在JDK5中出现的技术,使用它有更好的灵活性,比如可以实现多路通知功能,也就是在一个Lock对象里面可以创建多个Condition实例,线程对象可以注册在指定的Condition中,从而可以有选择性地进行线程通知,在调试线程上更加灵活。在使原创 2021-01-30 10:46:24 · 267 阅读 · 0 评论 -
java中线程的知识07---Reentrantlock
在Java多线程中,可以使用synchronized关键字来实现线程之间的同步互斥,但在JDK1.5中新增加ReentranLock类也可以达到同样的效果,并且在扩展功能上更加强大,比如具有嗅探锁定、多路分支通知等,而且在使用上也比synchronized更加灵活。代码测试片段一:import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Demo002原创 2021-01-28 23:31:35 · 109 阅读 · 2 评论 -
java中线程的知识入门了解02
为了进一步了解线程,我们从一个经典的买车票的例子开始。假设铁道部的网站上有100张火车票,三个售票点一起开始卖票。我们用一个售票点一个线程来模拟,实现多线程。先看一个程序:输出结果如下:以上说明:一个线程对象只能启动一个线程,无论你掉用多少遍start()方法都是不行的。那么就会有人跟我一样会去尝试以下这种方法了。修改原来的主函数里的内容,如下:原创 2015-12-21 23:31:00 · 374 阅读 · 0 评论 -
java中线程的知识入门了解03
距离上次了解线程已经过去一年半,现在我再次开始线程的理解。还是先从基础开始。这里不直接上代码,先把概要弄明白。我这里提到的是java中传统的多线程。以下分几个方面去讲:①概念:线程是在当代的操作系统中可以独立并发执行的基本单元,它轻量、独立、资源共享。②实现线程:我一年半前关于线程的第一篇博客就已经说明,java中多线程就两种实现方式。1、继承Thread类,重写run()方法。2、实原创 2017-03-28 15:36:35 · 238 阅读 · 0 评论 -
java中线程的知识04
上一篇博客讲到了线程的基础知识,这里开始写线程的同步机制。线程同步其实就是两个问题:①线程间共享数据的问题。②线程同步的实现机制。首先明白,为什么要线程同步:多线程并发执行访问同一数据时,容易发生数据状态不定,所以我们需要线程同步。demo代码如下,我们创建一个共享的Data数据,理想情况下,我们希望变量 i 的值交替输出:可是结果却不是我们所想要的。这里就发生了数原创 2017-03-28 16:26:38 · 212 阅读 · 0 评论 -
java中线程的知识05
这里讲线程间的通讯机制。线程间的通讯就以下几个方法:wait() 使当前线程进入指定对象的等待池。notify()从指定对象等待池中唤醒一个等待线程。notifyAll()从指定对象等待池中唤醒全部线程。具体的demo见下图:①首先我们创建了一个共享数据,数据里面有增加数据和减少数据两个方法,数据每增加5个就唤醒所有线程。②创建两个类,分别生产和消费我们上面提供的数据原创 2017-03-28 17:31:45 · 239 阅读 · 0 评论 -
java中线程的知识06-ThreadLocal类
Java并发编程中的threadLocal类首先ThreadLocal类用于创建只能由同一个线程读取和写入的线程局部变量。例子:如果两个线程正在访问引用相同的threadlocal变量的代码,那么每个线程都不会看到任何其他线程操作完成的线程变量。ThreadLocal类中可用的重要方法1、public T get() 返回当前线程的线程局部变量的副本中的值2、protected T...转载 2018-09-16 08:43:50 · 152 阅读 · 0 评论 -
Fork/Join框架简单介绍与使用
为了偷个懒,我就直接将我自己写程序的注释拿过来贴上去了。/** * @author * Fork/join框架是Java7提供的一个用于并行任务执行的框架,将一个大任务分解为若干个小任务,再汇总每个小任务 * 通常我们使用fork/join框架,需先创建一个任务,这里涉及的类是:ForkJoinTask,但实际我们都采用继承该类的子类来 * 实现创建任务这个功能。 * 该框架提供的...原创 2018-10-02 14:28:41 · 275 阅读 · 0 评论 -
Java中线程的知识入门了解01
作为一个java学习者,这段时间一直在看关于线程的问题。所以总结下来,分享一下,若有错误,希望扫过这篇文章的人指出。在此万分感谢。一,首先我们谈论线程(Thread),需要与他的近亲:进程(Process)一起比较才能明白。那么进程(Process)是什么呢?有人曾这样定义进程:是一个“执行中的程序”。不过我更喜欢用面向对象的概念来定义进程:进程是执行程序的实例。实际中我们使用电脑的一原创 2015-12-20 19:47:50 · 418 阅读 · 0 评论