摘要:
简介 1、诸如 Web 服务器、数据库服务器、文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务。请求以某种方式到达服务器,这种方式可能是通过网络协议(例如 HTTP、FTP )、通过 JMS队列或者可能通过轮询数据库。不管请求如何到达,服务器应用程序中经常出现 阅读全文
摘要:
简介 1、用于交换数据 2、它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对 阅读全文
摘要:
简介 控制并发数量 使用场景:接口限流 案例1 import java.util.concurrent.Semaphore; public class SemaphoreDemo { public static void main(String[] args) { // 指定个数 Semaphore 阅读全文
摘要:
简介 1、允许一组线程相互等待达到一个公共的障碍点,之后再继续执行 2、跟countDownLatch的区别 CountDownLatch一般用于某个线程等待若干个其他线程执行完任务之后,它才执行;不可重复使用 CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行; 阅读全文
摘要:
简介 await() 进入等待的状态 countDown() 计数器减一 代码案例 import java.util.concurrent.CountDownLatch; public class CountDownLatchDemo { public static void main(String 阅读全文
摘要:
简介 在并发编程中,LinkedBlockingQueue使用的非常频繁。因其可以作为生产者消费者的中间商 add() 实际上调用的是offer,区别是在队列满的时候,add会报异常 offer() 对列如果满了,直接入队失败 put("111") 在队列满的时候,会进入阻塞的状态 remove() 阅读全文
摘要:
同步容器 Vector、HashTable: JDK提供的同步容器类 Collections.synchronizedXXX 本质是对相应的容器进行包装 同步容器类的缺点: 在单独使用里面的方法的时候,可以保证线程安全,但是,复合操作需要额外加锁来保证线程安全 使用Iterator迭代容器或使用使用 阅读全文
摘要:
简介 1、一度认为原子是不可分割的最小单位,故原子类可以认为其操作都是不可分割 2、对多线程访问同一个变量,我们需要加锁,而锁是比较消耗性能的,JDk1.5之后,新增的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式,这些类同样位于JUC包下的atomic包下,发展到JDk1.8 阅读全文
摘要:
简介 1、可以在一个锁里面,存在多种等待条件 2、主要的方法: await 挂起 signal 随机唤醒1个线程 signalAll 唤醒所有等待的线程 代码案例 /** * 生产者线程 */ public class Producer implements Runnable{ private Me 阅读全文
摘要:
简介 1、线程变量,是一个以ThreadLocal对象为键、任意对象为值的存储结构。为每个线程单独存放一份变量副本,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的一个值。只要线程处于活动状态并且ThreadLocal实例可访问,那么每个线程都拥有对其本地线程副本的隐式 阅读全文
摘要:
简介 1、使用场景:线程A执行到一半,需要一个数据,这个数据需要线程B去执行修改,只有B修改完成之后,A才能继续操作 2、线程A的run方法里面,调用线程B的join方法,这个时候,线程A会等待线程B运行完成之后,再接着运行 代码案例 public class Main { public stati 阅读全文
摘要:
简介 以内存为媒介,用于线程之间的数据传输 面向字节:PipedOutputStream、PipedInputStream 面向字符:PipedReader、PipedWriter 代码案例 public class Reader implements Runnable{ // 注入输入流 priv 阅读全文
摘要:
wait、notify、notifyAll 简介 1、在多线程环境下,有时候一个线程的执行,依赖于另外一个线程的某种状态的改变,这个时候,我们就可以使用wait与notify或者notifyAll 2、wait跟sleep的区别:wait会释放持有的锁,而sleep不会,sleep只是让线程在指定的 阅读全文
摘要:
简介 1、一般应用,都是读多写少,ReentrantReadWriteLock 因读写互斥,故读时阻塞写,因而性能上上不去。可能会使写线程饥饿 2、StampedLock的特点 所有获取锁的方法,都返回一个邮戳(Stamp),Stamp为0表示获取失败,其余都表示成功; 所有释放锁的方法,都需要一个 阅读全文
摘要:
简介 1、锁降级:写线程获取写入锁后可以获取读取锁,然后释放写入锁,这样就从写入锁变成了读取锁,从而实现锁降级的特性 2、锁降级之后,写锁并不会直接降级成读锁,不会随着读锁的释放而释放,因此需要显式地释放写锁 3、锁降级的应用场景:用于对数据比较敏感,需要在对数据修改之后,获取到修改后的值,并进行接 阅读全文
摘要:
查看案例 public void inCreate() { writeLock.lock(); try { i++; Thread.sleep(500L); j++; } catch (InterruptedException e) { e.printStackTrace(); }finally { 阅读全文
摘要:
查看类的关系 查看读锁方法 public void out(){ readLock.lock(); try { System.out.println(Thread.currentThread().getName()+"i的值 》"+i + "j的值 》"+j); }finally { readLoc 阅读全文
摘要:
查看源码 # ctrl + 点击ReentrantReadWriteLock abstract static class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 63 阅读全文
摘要:
读写锁特性 特性:写写互斥、读写互斥、读读共享 锁降级:写线程获取写入锁后可以获取读取锁,然后释放写入锁,这样就从写入锁变成了读取锁,从而实现锁降级的特性 案例1 public class ReentrantReadWriteLockDemo { private int i = 0; private 阅读全文
摘要:
案例 public class ReentrantLockDebugDemo { // 变量i private int i = 0; // new1个reentrantLock private ReentrantLock reentrantLock = new ReentrantLock(); // 阅读全文
摘要:
公平锁与非公平锁的区别 公平锁:所有线程都老老实实排队 非公平锁:只要有机会,就先尝试抢占资源 非公平锁的弊端 可能导致后面排队等待的线程等不到相应的cpu资源,从而引起线程饥饿 源码解析 public class ReentrantLockDemo { public static void mai 阅读全文
摘要:
代码案例 public class ReentrantLockDemo { public static void main(String[] args) { ReentrantLock reentrantLock = new ReentrantLock(); reentrantLock.lock() 阅读全文
摘要:
锁的分类 1、自旋锁: 线程状态及上下文切换消耗系统资源,当访问共享资源的时间短,频繁上下文切换不值得。jvm实现,使线程在没获得锁的时候,不被挂起,转而执行空循环,循环几次之后,如果还没能获得锁,则被挂起 2、阻塞锁:阻塞锁改变了线程的运行状态,让线程进入阻塞状态进行等待,当获得相应的信号(唤醒或 阅读全文
摘要:
参考1 参考2 案例地址 创建远程仓库 生成token Settings->Developer settings->Personal access tokens 报错 Error creating blob: Git Repository is empty. (409) # 解决方案:远程仓库中没有 阅读全文
摘要:
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="true" /> # 完整如下 ... < 阅读全文
摘要:
参考1 参考2 参考3 参考4 导入依赖 <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>aws-sdk-java</artifactId> <version>2.14.26</version> </depende 阅读全文
摘要:
参考1 参考2 参考3 下载jar到本地 jave 导入本地仓库 mvn install:install-file -Dfile=jave-1.0.2.jar -DgroupId=joinery -DartifactId=jave -Dversion=1.0.2 -Dpackaging=jar 工程 阅读全文
摘要:
mvn install:install-file -Dfile=aliyun-java-vod-upload-1.4.14.jar -DgroupId=com.aliyun -DartifactId=aliyun-sdk-vod-upload -Dversion=1.4.14 -Dpackaging 阅读全文
摘要:
线程安全 当多个线程访问某个类,不管运行时环境采用何种调度方式或者这些线程如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类为线程安全的 新建线程不安全操作的案例类 public class UnSafeThread { private static 阅读全文
摘要:
进程与线程的区别 1、进程:是系统进行分配和管理资源的基本单位 2、线程:进程的一个执行单元,是进程内调度的实体、是CPU调度和分派的基本单位,是比进程更小的独立运行的基本单位。线程也被称为轻量级进程,线程是程序执行的最小单位 3、一个程序至少一个进程,一个进程至少一个线程 4、进程有自己的独立地址 阅读全文
摘要:
并发编程 计算机能运行多个程序,不同的程序在不同的单独的进程中运行 串行与并行 串行是大家排队一个一个来,并行是大家一起上 并发编程目的 摩尔定律:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。这一定律揭示了信息技术进步的速度。 让程序充分利用计算 阅读全文
摘要:
注解的定义 Annotation 是从JDK5.0开始引入的新技术 Annotation的作用 不是程序本身, 可以对程序作出解释 可以被其他程序(比如:编译器等)读取 Annotation的格式 注解是以"@注释名"在代码中存在的 还可以添加一些参数值 , 例如:@SuppressWarnings 阅读全文
摘要:
计算机网络 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大,功能强的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件,软件,数据信息等资源 tcp/ip模型 ip # 唯一的标识 internet 上的计算机 ( 通信实体 ) # 本地回环地址(hostAddre 阅读全文
摘要:
签名算法 # 如果小明用自己的私钥加密了一条消息,比如小明喜欢小红,然后他公开了加密消息,由于任何人都可以用小明的公钥解密,从而使得任何人都可以确认小明喜欢小红这条消息肯定是小明发出的,其他人不能伪造这个消息,小明也不能抵赖这条消息不是自己写的 # 私钥加密得到的密文实际上就是数字签名,要验证这个签 阅读全文
摘要:
密钥交换算法 # 如果我们把a看成甲的私钥,A看成甲的公钥,b看成乙的私钥,B看成乙的公钥 # DH算法的本质就是双方各自生成自己的私钥和公钥,私钥仅对自己可见,然后交换公钥,并根据自己的私钥和对方的公钥,生成最终的密钥secretKey # DH算法通过数学定律保证了双方各自计算出的secretK 阅读全文
摘要:
对称加密算法 对称加密算法就是传统的用一个密码进行加密和解密 根据算法名称/工作模式/填充模式获取Cipher实例; 根据算法名称初始化一个SecretKey实例,密钥必须是指定长度; 使用SerectKey初始化Cipher实例,并设置加密或解密模式; 传入明文或密文,获得密文或明文。 | 算法 阅读全文
摘要:
BouncyCastle加密 # 导入bcprov-jdk15on-xxx.jar public class Main { public static void main(String[] args) throws Exception { // 注册BouncyCastle: Security.ad 阅读全文
摘要:
url编码 Java标准库提供了一个URLEncoder类来对任意字符串进行URL编码 # 加密 public class Main { public static void main(String[] args) { String encoded = URLEncoder.encode("中文!" 阅读全文
摘要:
简介 序列化:一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型 反序列化:将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化 序列化前提 一个类的对象要想序列化成功,必须满足两个条件: 该类必须实现 java.io.Seri 阅读全文
摘要:
小程序与普通网页开发的区别 运行环境不同 网页运行在浏览器环境中 小程序运行在微信环境中 开发模式不同 网页的开发模式:浏览器 + 代码编辑器 小程序标准开发模式:申请小程序开发账号、安装小程序开发者工具、创建和配置小程序项目 API 不同 由于运行环境的不同,所以小程序中,无法调用 DOM 和 B 阅读全文