JAVA多线程
目前主要以JAVA多线程反面,以基础为主
Bonjour~Bridge
踏踏实实做基础的技术学习
展开
-
JAVA多线程基础:多线程的三种实现方式
线程运行速度比进程速度快第一种:继承抽象类Thread类每个线程同一时间只能运行一次,否则就会抛出IllegalTheadStateException()异常内部是JNI实现(即strat0()方法),JVM根据不同的系统实现不同的start0()方法任何情况下,只要定义了多线程,多线程的启动永远只有一种方案,Thread类中的start()方法import java.util.function.*;class MyThread extends Thread{ private Stri.原创 2020-06-18 23:32:29 · 92 阅读 · 0 评论 -
JAVA多线程基础:线程的优先级
线程是对资源的抢夺,自然也就可以做设置每个线程的优先级优先级设置设置优先级:public final void setPriority(int new Priority);默认优先级: 5(NORM_PRIORITY)最高优先级:MAX_PRIORITY 10中等优先级:NORM_PRIORITY 5最低优先级:MIN_PRIORITY 1获取优先级:public final int getPriority()线程的强制执行另外,我们可以在一个线程运行时,让另外一个线程强制执行(原创 2020-07-21 17:39:55 · 267 阅读 · 0 评论 -
JAVA多线程基础:相关的小知识点
多线程的几种状态创建start()就绪状态阻塞状态运行状态终止进程与休眠一个程序中可以启动若干个JVM,每个JVM就是一个进程休眠可以设置为毫秒和纳秒2种精确度,如果被打断会抛出Exception子类的异常,必须处理(所以打扰人家睡觉,后果很严重)所有线程运行同一个方法时,也会有先后,并没有绝对的一起执行线程名称设置与获得开发为了获得一些线程的操作,可以通过线程的名称获得构造方法:public Thread(Runnable target,String n原创 2020-07-21 17:39:01 · 65 阅读 · 0 评论 -
JAVA多线程基础:线程间的数据传输PipedOutputStream和PipedInputStream
PipedOutputStream:继承OutputStream,很明显就是对外发送数据的PipedInputStream:继承InputStream,用于接收数据的下面我们看一个例子首先是发送数据的线程class SendThread implements Runnable{ volatile PipedOutputStream outputStream; public SendThread(){ outputStream = new PipedOutputSt.原创 2020-06-30 17:09:20 · 258 阅读 · 0 评论 -
JAVA多线程基础:为每个线程单独保存自己的数据 - ThreadLoacl
ThreadLocal应用场景当我们多个线程需要对一个公共的变量就行修改,而我们希望这个变量不受其他线程的影响,但我们有不方便所线程同步(线程同步会影响性能),那么我们可以为每个线程都设置一个单独的变量,让他们自己去修改,此时,我们就可以用上ThreadLocal下面,我们可以先看一下,多线程下数据同时被多个线程修改,产生的情况:package com.zty.demo;import java.util.ResourceBundle;/** * @创建人 zhangtaiyuan *原创 2020-06-30 16:45:56 · 2028 阅读 · 0 评论 -
JAVA多线程基础:实现多线程的3种常用方式
线程运行速度比进程速度快实现多线程的3种方案可以实现Thread类任何情况下,只要定义了多线程,多线程的启动永远只有一种方案,Thread类中的start()方法内部调用的是strat0(),这是一个JNI实现方法,JVM根据不同的系统实现不同的start0()方法import java.util.function.*;class MyThread extends Thread{ private String title; public MyThread(String title.原创 2020-06-21 17:16:48 · 123 阅读 · 0 评论 -
JAVA多线程基础:高效的无锁并行计算CAS算法
CAS算法为了解决什么问题?我们为了在多线程下保持数据同步,不得不在不同的线程间进行锁竞争时,这样总不可避免相互等待,从而阻塞当前线程。这样导致的性能低下……什么是CAS算法如果我们让每个线程拥有各自独立的变量副本,当各个线程在并行计算时,无需相互等待对方的结果,最后将大家运行的结果拿出来对比,对比“胜出”的就为最终的结果,所以这是一种基于比较交换的无锁并发控制方法。算法优点虽然无锁算法的设计和实现更为复杂的多,但是它有以下优点:由于其非阻塞性,它对死锁问题天生免疫,既无死锁问题线程间的相互原创 2020-05-13 12:17:37 · 244 阅读 · 0 评论 -
JAVA多线程基础:锁的优化方式总结
1.避免死锁场景模拟有2个小孩,A和B,A拿着B的玩具,B拿着A的零食,A对B说,你先把零食还给我,我才把玩具还给你,B不干,于是对A说,你先把玩具给我,我才把零食还给你,于是陷入了僵持,这就是死锁,死锁的场景也有可能是多个小孩出现的条件互斥条件:一个资源每次只能被一个进程使用(B的玩具,被A拿来完,其他人就不能玩了)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放(A拿着B的玩具,不还零食不放手)不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺(来个大人,强行抢了原创 2020-05-12 22:21:08 · 161 阅读 · 0 评论 -
JAVA多线程基础:Semaphore信号量
介绍如果我们希望能够控制多个线程可以同时访问一个资源的数量,那么就可以使用Semaphore信号量业务场景这个是JDK中的对信号量的例子,这个例子实现了一个对象池,对象池的最大容量为100.因此,当访问请求超过100,未获得资源的线程就会等待,如果有对象返回对象池,等待的线程就可被唤醒代码如下 class Pool { private static final int MAX_AVAILABLE = 100; private final Semaphore available = ne原创 2020-05-12 02:29:38 · 120 阅读 · 0 评论 -
JAVA多线程基础:Condition对象
介绍如果我们希望A线程可以控制B线程,同时B线程也可以控制A线程,那么Condition对象可以帮到我们。业务场景此时,我们有一个队列item,他处于多线性下面调用,我们希望当item为空时,取数据的线程就会停止并等待数据添加当item从空的状态被添加了数据后,取数据的线程就能继续运行当item 满了 的时候,我们希望添加数据的线程就会停止并等待数据被提取当item由满了后第一次被取走数据,我们希望添加数据的线程就能继续运行以上就是,取数据线程和添加数据线程,根据队列中数据的“空”、“满原创 2020-05-12 01:55:34 · 371 阅读 · 0 评论 -
JAVA多线程基础:ReadWriteLock读写锁简单实现
介绍刚开始一听这名字就有些懵逼,写要加锁我明白,读为啥还要加锁啊?看了别人博客后才明白读写锁允许同一时刻被多个读线程访问,但是在写线程访问时,所有的读线程和其他的写线程都会被阻塞。原来是怕读入脏输入啊,为了保证每次读到的数据都是最新修改的数据,好吧!这个代码也挺简单的,直接上代码吧!代码创建读写锁的对象import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantReadWriteLo原创 2020-05-11 23:20:44 · 226 阅读 · 0 评论 -
JAVA多线程基础:重入锁ReentrantLock简单实现
它比内部锁synchronized拥有更加强大的功能,他可以中断、定时。它提供了著名的公平锁和非公平锁公平锁和非公平锁公平锁:获取不到锁的时候,会自动加入队列,等待线程释放后,队列的第一个线程获取锁非公平锁:获取不到锁的时候,会自动加入队列,等待线程释放锁后,所有等待的线程同时去竞争性能上,非公平锁的性能要好得多,如果没有特殊要求,优先考虑非公平锁public ReentrantLock(boolean fair) //fair决定是否为公平锁下面是简单的ReentrantLock代码使用原创 2020-05-11 18:59:10 · 121 阅读 · 0 评论 -
JAVA多线程基础:关键字Synchronized
介绍在多线程同步中,我们最常使用的关键字之一就是synchronized了,它的使用简单明了,易读、易维护……用法锁定方法如果method方法已经被其他线程占用,则此时的调用线程需要等待方法调用结束后,才能调用public synchronized void method(){ … … }或者,效果和上面代码一样public void method(){synchronized(this){ … … }}锁定代码块如果我们只是需要同步部分代码,而不用锁定整个方法,可以如下操作:(效原创 2020-05-11 18:00:03 · 123 阅读 · 0 评论 -
JAVA多线程基础:常用的并发的数据结构性能对比
ListArrayList不是线程安全的数据结构,在多线程下尽量减少使用CopyOnWriteArrayList修改时:先获取对象的一个副本,然后对副本进行修改读取时:由于对象未发生改变,因此不需要加锁,性能高效Vector读取:使用了同步关键字,所有的get()操作都必须先取得对象锁才能进行。在高并发的情况下,大量的锁竞争会拖累系统性能修改:也使用了同步关键字,但是Vector相对于CopyOnWriteArrayList更加高效总结读取更多时候,选择CopyOnWriteAr原创 2020-05-11 11:11:11 · 377 阅读 · 0 评论 -
JAVA多线程基础:线程池的原理与使用
为啥要用线程池呢?大概就一下原因吧!线程的使用如果不加控制和管理,会对系统的性能会产生不利的影响线程的创建和消耗会占用很多时间大量的线程回收会给GC带来很大的压力,延迟GC停顿时间模拟线程池这里只是简单的模拟线程池,让大家了解原理,真正的线程池比这个麻烦很多……其中,我们只需要2个类ThreadPool:这个就是线程池,他的主要作用的管理线程,有线程就提供,没有线程了就创建再提供,用完了就回收PThread:线程池都有了,那这个是干什么的呢?一般我们创建的线程开始后,都会自动的销毁,原创 2020-05-10 21:02:53 · 164 阅读 · 0 评论