202106-12 Java多线程之线程同步 volatile先看个例子classTest{//定义一个全局变量privatebooleanisRun=true;//从主线程调用发起publicvoidprocess(){test();try{Thread.sleep(2000);}catch(InterruptedExceptione){e.printStackTrace();}stop();}//启动一个子线程循环读取isRunprivatevoidtest(){newThread(newRunnable(){... 继续阅读 >
202106-12 Java多线程之ReentrantReadWriteLock源码解析 一、介绍1.1ReentrantReadWriteLockReentrantReadWriteLock是一个读写锁,允许多个读或者一个写线程在执行。内部的Sync继承自AQS,这个Sync包含一个共享读锁ReadLock和一个独占写锁WriteLock。该锁可以设置公平和非公平,默认非公平。一个持有写锁的线程可以获取读锁。如果该线程先持有写锁,再持有读锁并释放写锁,称为锁降级。WriteLock支持Condition并且与ReentrantLock语义一致,而ReadLock则不能使用Condition,否... 继续阅读 >
202106-05 Java多线程之线程的创建 一、三种创建方式基于什么创建创建的方式Thread类继承Thread类Runnable接口实现Runnable接口callable接口实现callable接口二、通过Thread类创建2.1步骤自定义线程类继承Thread类重写run()方法,编写线程执行体(当成main()方法用)创建... 继续阅读 >
202105-25 Java基础之多线程的三种实现方式 一、前言Java多线程实现的三种方式有继承Thread类,实现Runnable接口,使用ExectorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。二、继承Thread类实现多线程1.Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法。2.start()方法是一个native方法,它将启动一个新线程,并... 继续阅读 >
202105-25 Java多线程之Park和Unpark原理 一、基本使用它们是LockSupport类中的方法//暂停当前线程LockSupport.park();//恢复某个线程的运行LockSupport.unpark(暂停线程对象)应用:先park再unparkThreadt1=newThread(()->{log.debug("start...");sleep(1);log.debug("park...");LockSupport.park();log.debug("resume...");},"t1");t1.start();sleep(2);log.debug("unpark...");LockSupport.unpark(t1);... 继续阅读 >
202105-25 Java多线程之深入理解ReentrantLock 前言保证线程安全的方式有很多,比如CAS操作、synchronized、原子类、volatile保证可见性和ReentrantLock等,这篇文章我们主要探讨ReentrantLock的相关内容。本文基于JDK1.8讲述ReentrantLock.一、可重入锁所谓可重入锁,即一个线程已经获得了某个锁,当这个线程要再次获取这个锁时,依然可以获取成功,不会发生死锁的情况。synchronized就是一个可重入锁,除此之外,JDK提供的ReentrantLock也是一种可重入锁。二、ReentrantLock2.... 继续阅读 >
202105-25 Java多线程之哲学家就餐问题详解 一、题目教材提供一个哲学家就餐问题的解决方案的框架。本问题要求通过pthreads互斥锁来实现这个解决方案。哲学家首先创建5个哲学家,每个用数字0~4来标识。每个哲学家作为一个单独的线程运行。可使用Pthreads创建线程。哲学家在思考和吃饭之间交替。为了模拟这两种活动,请让线程休眠1到3秒钟。当哲学家想要吃饭时,他调用函数:pickup_forks(intphilosopher_number)其中,philosopher_number为想吃饭哲学家的... 继续阅读 >
202105-23 Java多线程之简单模拟售票功能 一、创建二、完整代码packagecom.ql;importlombok.SneakyThrows;importokhttp3.Call;importokhttp3.OkHttpClient;importokhttp3.Request;importokhttp3.Response;importjava.io.IOException;publicclassMythreadextendsThread{publicMythread(Stringname){super(name);}@SneakyThrows@Overridepublicvoidrun(){for(;;){//锁的状态是默认是打开状态... 继续阅读 >
202105-02 java的多线程高并发详解 1.JMM数据原子操作read(读取)∶从主内存读取数据load(载入):将主内存读取到的数据写入工作内存use(使用):从工作内存读取数据来计算assign(赋值):将计算好的值重新赋值到工作内存中store(存储):将工作内存数据写入主内存write(写入):将store过去的变量值赋值给主内存中的变量lock(锁定):将主内存变量加锁,标识为线程独占状态unlock(解锁):将主内存变量解锁,解锁后其他线程可以锁定该变量2.来看vol... 继续阅读 >
202104-27 Java多线程之线程池七个参数详解 ThreadPoolExecutor是JDK中的线程池实现,这个类实现了一个线程池需要的各个方法,它提供了任务提交、线程管理、监控等方法。下面是ThreadPoolExecutor类的构造方法源码,其他创建线程池的方法最终都会导向这个构造方法,共有7个参数:corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler。publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,... 继续阅读 >
202103-30 Java多线程面试题(面试官常问) 进程和线程进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是从一个进程从创建、运行到消亡的过程。在Java中,当我们启动main函数时其实就是启动了一个JVM的进程,而mian函数所在的线程就是这个进程中的一个线程,称为主线程。线程是比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程都有自己的程... 继续阅读 >
202102-01 Java多线程实现简易微信发红包的方法实例 一、首先我们先大致了解一下什么是多线程。(书上的解释)程序是一段静态的代码,它是应用软件的蓝本。进程是程序的一次动态执行过程,对应了从代码加载执行,执行到执行完毕的一个完整的过程。线程不是进程,线程是比进程更小的执行单位,一个进程在其执行过程中,可以产生多个线程形成多条执行线索,每条线索即每个线程也有它自身的产生,存在,消亡的过程,和进程共享操作系统的资源类似,线程间也可以共享进程中的某些内... 继续阅读 >
202012-14 Java中多线程与并发_volatile关键字的深入理解 一、volatile关键字volatile是JVM提供的一种轻量级的同步机制,特性:1.保证内存可见性2.不保证原子性3.防止指令重排序二、JMM(JavaMemoryModel)Java内存模型中规定了所有的变量都存储在主内存中(如虚拟机物理内存中的一部分),每条线程还有自己的工作内存(如CPU中的高速缓存),线程的工作内存中保存了该线程使用到的变量到主内存的副本拷贝,线程对变量的所有操作(读取、赋值)都必须在工作内存中进行,而不能直接读写主内... 继续阅读 >
202011-03 Java多线程、进度条实现赛马实验的示例代码 赛马下周一就要去做java实验了,还记得上一次实验还有一个程序没写完,匆匆交了实验报告的半成品(希望老师没发现www)。为了下周一能有更充裕的时间在实验课写代码,我搜了一下我们学校的实验报告。嘿,宁猜怎么着!还真有16年的实验报告。虽然有点不太一样,但题目大多是相同的,于是我就开始写。这是有关赛马的一个程序,题目如下:编写一个多线程的控制程序,称为赛马程序。创建分别代表两匹马的两个线程,并将它们设置为高低... 继续阅读 >
202010-10 java多线程之Future和FutureTask使用实例 Executor框架使用Runnable作为其基本的任务表示形式。Runnable是一种有局限性的抽象,然后可以写入日志,或者共享的数据结构,但是他不能返回一个值。许多任务实际上都是存在延迟计算的:执行数据库查询,从网络上获取资源,或者某个复杂耗时的计算。对于这种任务,Callable是一个更好的抽象,他能返回一个值,并可能抛出一个异常。Future表示一个任务的周期,并提供了相应的方法来判断是否已经完成或者取消,以及获取任务的结果... 继续阅读 >
202010-08 Java多线程中Lock锁的使用总结 多核时代 摩尔定律告诉我们:当价格不变时,集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,性能也将提升一倍。换言之,每一美元所能买到的电脑性能,将每隔18个月翻两倍以上。然而最近摩尔定律似乎遇到了麻烦,目前微处理器的集成度似乎到了极限,在目前的制造工艺和体系架构下很难再提高单个处理器的速度了,否则它就被烧坏了。所以现在的芯片制造商改变了策略,转而在一个电路板上集成更多... 继续阅读 >