多线程和高并发
文章平均质量分 83
101之歌
一个屌丝搬砖程序员
展开
-
Java多线程和高并发学习笔记1
Synchronized的底层原理CAS算法Compare And Swap,这个是它的英文全称,翻译过来就是比较并且交换,如果要说这个算法,可以先来看看下面的这个例子:jdk1.8以后,增加了一系列的原子类的对象,比如AtomicInteger可以实现多线程下的递增,保证线程安全,在我们查看它的源代码的时候可以发现有一个addAndGet方法,在我们查看它的实现的时候可以发现:它这块调用的是unsafe这个类的方法:然后我们再往底层去看的时候,会发现它其实是一个do-whlie循环,而whi原创 2021-04-06 21:51:29 · 170 阅读 · 2 评论 -
Java多线程和高并发学习笔记2
Volatile主要有两个作用:1、线程可见性:用volatile修饰的变量,可以在不同线程之间互相看到,如果一旦发生修改,其他线程就会刷新当前的变量,保证变量的数据一致性2、阻止指令重排序下面这个代码,无论加不加volatile,都会执行到end,暂时没搞懂package thread;import java.util.concurrent.TimeUnit;public class TestVolatile { private static boolean isRunning原创 2021-04-11 17:50:32 · 139 阅读 · 0 评论 -
Java多线程和高并发学习笔记3
单例模式单例模式:就是某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式,经典例子:JVM运行环境的Runtime类设计单例模式的要点:1、某个类只能有一个实例(构造器私有化)2、它必须是自行创建这个实例(含有一个该类的静态变量来保存这个唯一的实例)3、它必须自行向系统提供这个实例(向外提供获取该实例对象的方式:1、直接暴露 2、用静态变量的get方法去获取)实现方式:1、饿汉式:直接创建对象,不存在线程安全的问题2、懒汉式:延迟创建对象,存在线程安全的问题,但是可以解决首先我们原创 2021-04-20 23:44:09 · 146 阅读 · 2 评论 -
Java多线程和高并发学习笔记4
线程的基本概念程序:是指令和数据的有序集合,其本身没有任何运行的含义,就是一个静态的概念进程:进程则是执行程序的一次执行过程,它是一个动态的概念,是系统资源分配的单位线程:通常是一个进程里面可以包含多个线程,线程是CPU调度和执行的单位PS:很多多线程是模拟出来的,真正的多线程是指有多个cpu,即多个核心数,如果是模拟出来的多线程,即在一个cpu的情况下,在同一个时间点,cpu只能执行一个代码,因为切换的很快,所以就有同时执行的错觉下面提几个java线程的概念:1、main线程被称为主线程,为系原创 2021-04-24 18:20:35 · 101 阅读 · 0 评论 -
Java多线程和高并发学习笔记5
Java多线程之间的通信,最常见的就是生产者-消费者模式,通过一个状态码来控制什么时候去生产和消费,下面我们就来写一个简单的例子,来看看这种最常见的线程之间的通信方式package thread3;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 对同一个数字,两个线程,原创 2021-05-02 11:09:52 · 96 阅读 · 0 评论 -
Java多线程和高并发学习笔记6
Callable接口我们知道,java中实现多线程的方式有好几种,下面我们就来看看Callable接口代码很简单:// 实现Callable接口class Demo implements Callable<Integer> { @Override public Integer call() { System.out.println("come in Callable"); try { TimeUnit.SECONDS原创 2021-05-03 20:40:19 · 392 阅读 · 5 评论 -
Java多线程和高并发学习笔记7
字符串池举个例子:String a = "a" + "b";System.out.println(a);System.out.println(a.intern());System.out.println(a == a.intern());String b = new String("ja" + "va");System.out.println(b);System.out.println(b.intern());System.out.println(b == b.intern());上原创 2021-05-04 18:14:21 · 132 阅读 · 0 评论 -
Active MQ的高级特性
异步投递(useAsyncSend=true)Active MQ支持同步,异步两种方式发送消息到broker,模型的选择对发送的时延有巨大的影响。Active MQ默认使用异步的发送的模式,如果没有使用事务且发送的是持久化的消息,每一次的发送都是同步的,且会阻塞producer直到broker返回一个确认,表示消息已经被安全的持久化到磁盘,确认机制提供了安全的保障,但是会给客户端带来很大的时延异步发送的方式可以最大化producer的发送效率,我们通常在发送消息量比较密集的情况下使用异步发送,它可以很原创 2021-04-20 22:15:24 · 133 阅读 · 0 评论 -
Active MQ的Master-Slave
官网推荐的方式使ZooKeeper+Level DB的方式搭建集群MQ集群来保证高可用常见的集群搭建方式有2种:1、使用共享的文件存储系统,例如SAN(存储局域网),一个master加多个slave节点保证数据不会丢失2、使用JDBC的master-slave配置方式,需要多个slave节点,并且需要一个共享的数据库,但是没有办法使用高性能的journal,因为journal只能用在单机的mysql上面,多节点是不支持的,所以性能就会比较低下Level DB:是5.6版本以后推出的持久化引擎,使用原创 2021-04-20 20:22:20 · 157 阅读 · 0 评论 -
Active MQ的持久化
MQ的高可用:1、事务2、持久3、签收前3个都是MQ本身的特性,如果MQ出现了故障,上面的3个就无法保证了4、可持久化只有第4个可持久化才能保证高可用,通常来说,执行持久化的机器要和安装MQ的机器分开,才能保证不会产生事故V5.3用的是Kaha DBV5.9用的是Apache ZooKeeperActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB就是发送者将消息发送出去以后,消息中心首先将消息存储到本地数据文件,内存数据库或者远程数据库,再试图将消息发送给接收原创 2021-04-15 22:46:39 · 377 阅读 · 0 评论