- 博客(31)
- 收藏
- 关注
原创 阻塞队列--生产者消费者-demo
package zhq_stu.gaopin_kaodian;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;public class Product_cusmoer_blockqueu...
2021-03-11 10:27:08 139
原创 阻塞队列
阻塞队列可以认为是一个容器当阻塞队列是空的时候,从队列中获取元素的操作将会被阻塞当阻塞队列是满的时候,从队列中插入元素的操作将会被阻塞阻塞队列继承关系 collection queue blockingqueue (接口) arrayblockingqueue 由数组结构组成的有界阻塞队列 linkedblockingqueue 有链表结构组成的有界(但大小默认是m...
2021-03-11 10:23:47 167
原创 锁相关-cas和AtomicStampedReference
悲观锁、乐观锁乐观锁与悲观锁并不是特指某个锁,而是在并发情况下保证数据完整性的不同策略。是一种理念悲观锁具有强烈的独占和排他特性。它指的是对数据被外界修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态传统关系型数据库里面的很多锁就是采用的这种机制,例如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。java里面的synchronize和ReentrantLock等重入锁就是采用的这种机制;乐观锁总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改...
2021-03-11 10:23:18 197
原创 多线程卖票-demo
public static void main(String[] args) { ThreadDemo2 runnal = new ThreadDemo2(); for (int i = 0; i < 3; i++) { new Thread(runnal,"线程" + i).start(); }}class ThreadDemo2 implements Runnable { private int ticket = 1000; L...
2021-03-11 10:22:38 87
原创 冒泡排序算法
public static void maopao(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr...
2021-03-11 10:22:01 73
原创 堆排序
public static void heapSortTest(int[] arr) { //大顶堆 二叉树的第一个非叶子节点 length/2-1 i节点的左子节点 2*i+1 右子节点 2*i+2 //第一个非叶子节点开始 for (int node_inx = arr.length / 2 - 1; node_inx >= 0; node_inx--) { adjustHeapTest(arr, node_inx, arr.le...
2021-03-11 10:21:38 57
原创 快速排序
/** * 快速排序 * 传过来一个数组和需要排序的起始下标和终止下标 * 以数组的起始下标的值做为基准点 * 从右边起,进行判断,都是大于基准值的,当存在一个小于基准数的,记录下标 * 从左边起,进行判断,都是小于基准值的,当存在一个大于基准数的,记录下标 * * 将以上的两个值进行对调 * 将对调后左边的值与第一个值进行对调 * 这样对于左边的数据,都是小于该值的,对于右边的数据,都是大于该值的, * 将该数值分为两段,进行递归操作,往返进行,得到排序后的值 * ...
2021-03-11 10:21:20 68
原创 插入排序
/** * 从数组的第二位开始遍历每一个元素 * 对遍历的每一个元素都与前面的元素进行比较,如果比前面遍历到的元素要小,就进行移位 * 在进行遍历的时候,左边的元素都是一个有序的数组 * * 插入排序 * @param arr */public static void insertSort2(int[] arr) { //移位 //补位 for (int i = 1; i < arr.length; i++) { int temp = ...
2021-03-11 10:21:00 67
原创 选择排序
//选择排序public static void selectSort(int[] arr) { //选择排序 从第一个元素与后面的所有元素相比较,找到最小的一个值,与第一个元素相比较,然后进行替换 //在从第二个元素开始 // for (int i = 0; i < arr.length - 1; i++) { //最小值的下标 int minIndex = i; for (int j = i + 1;...
2021-03-11 10:20:19 76
原创 shell排序(插入排序升级)
//插入排序升级public static void shellSort(int[] arr) { //进行分组 //第一次两个一组 //第二次四个一组 for (int gap = arr.length / 2; gap > 0; gap /= 2) { //插入排序算法 //步长为gap 即每次移动的跨度 1/2 1/2/2=1/4 1/2/2/2=1/8 //先写插入排序 f...
2021-03-11 10:19:50 105
原创 线程安全集合类
使用线程不安全的集合在多线程下会发生异常java.util.ConcurrentModificationException例如arraylist hashmapArraylista.可以使用线程安全的相关集合类 List<String> list =Collections.synchronizedList(new ArrayList<>()); Map<Object, Object> objectObjectMap =Collections...
2021-03-10 10:39:45 304
原创 生产者消费者-lock-condition
虚假唤醒在使用condition.await();方法时,应将该方法放入循环中,避免虚假唤醒,await()方法,线程等待,并且释放锁的资源,在其他线程调用notifyall方法,并且抢到资源后,继续执行后面的程序;在使用if判断条件进行线程是否等待时,会有多个线程在此处等待,在其他线程进行唤醒的时候,在此处等待的两个线程会连续唤醒,执行后续的程序导致不符合预期,这个现象叫做虚假唤醒。 在唤醒线程后,需要进行一次判断条件是否满足,故需要将awite放在while循环中。在api中会明确的指出
2021-03-10 10:37:18 88
原创 创建线程池
//创建固定线程数的线程池Executor threadPoolFixed = Executors.newFixedThreadPool(3);//创建一个线程的线程池Executor threadPoolSingle = Executors.newSingleThreadExecutor();//创建缓存的线程池ExecutorService executorCache = Executors.newCachedThreadPool();try{ for (int i = 0;...
2021-03-10 10:34:24 53
原创 使用Callable启动多线程
class TestCall implements Callable { @Override public Object call() { System.out.println(Thread.currentThread().getName() + "打印"); return "返回数据"; }}public class Test_callable { public static void main(String[] arg...
2021-03-10 10:32:32 245
原创 volatile
volatile是什么轻量级的同步机制1.保证可见性2.不保证原子性3.禁止指令重拍主内存,线程的工作内存线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝到自己的工作内存中,然后对变量操作,操作完成后,在将变量写回主内存,不能直接操作主内存中的变量volatile保证可见性,当一个线程修改了变量后,可以及时的通知到其他的线程volatile不保证原子性i++的流程启动多个线程进行i++操作时,执行结果并不符合预期,对i++进行分析主内存.
2021-03-10 10:30:14 129
原创 ReadWritLock-demo
ReadWritLock基础用法 public class TestReadWritLock { public static void main(String[] args) { ReadWriteLock2 readWriteLock = new ReadWriteLock2(); new Thread(new Runnable() { @Override public void run() {
2021-03-10 10:27:56 95
原创 CountdownLatch和CyclicBarrier概念
CountDownLatch概念 CountDownLatch是一个同步工具类,可以理解就是个计数器,只能减不能加,同时它还有个门闩的作用,当计数器不为0时,门闩是锁着的;当计数器减到0时,门闩就打开了。CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可...
2021-03-10 10:26:38 97
原创 condition-交替打印demo
启动3个线程,交替打印出线程名,轮训5轮 public static void main(String[] args) { Jiaoti2 jiaoti2 = new Jiaoti2(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 5; i++...
2021-03-10 10:24:20 309
原创 多线程常用总结
list集合使用写时复制类来避免并发问题CopyOnWriteArrayList copy = new CopyOnWriteArrayList(); 非静态方法的锁为this 静态方法的锁为class实例 某一个时刻,只能有一个线程持有锁,不管几个方法 executors i++操作 主内存 线程的工作内存 1.load将i的值拷贝到自己的工作内存中 2.对i的值进行加1 3.将修改后的i的值写回到主内存中...
2021-03-10 10:22:27 66
原创 mysql锁
表锁、行锁表锁:偏向于myisam 锁的粒度大,速度快,开销小,无死锁,发生锁冲突频率高myisam 偏读lock table table_name read/write //锁表 读锁和写锁unlock table_name //解锁show open tables; //查看状态, in_use = 0 表示正常读锁、写锁读锁共享写锁排他读锁 session1 session2 获取读锁 lock table table_...
2021-03-09 15:48:06 125 1
原创 mysql事务隔离级别的实现
MVCCMVCC的全称是“多版本并发控制”。这项技术使得InnoDB的事务隔离级别下执行一致性读操作有了保证,换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值。这是一个可以用来增强并发性的强大的技术,因为这样的一来的话查询就不用等待另一个事务释放锁。这项技术在数据库领域并不是普遍使用的。一些其它的数据库产品,以及mysql其它的存储引擎并不支持它。InnoDB会给数据库中的每一行增加三个字段,它们分别是DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID,
2021-03-09 15:45:28 137 1
原创 mysql索引
索引失效1.对索引列进行操作(计算、函数、自动或手动类型转换)2.使用!=或者<>3.is null,is not null4.like 以通配符开头(“%abc”)5.字符串不加单引号索引失效6.使用or使用索引要遵循最佳左前缀主键索引与唯一索引 保证唯一性 是否允许为空 一个表中可以有多少个 能否组合 primary key(主键索引) ...
2021-03-09 15:39:05 123 1
原创 集合
Listarraylist动态数组,初始容量为10,每次扩容为原来的长度+原来的长度/2对于按下标进行查询时效率较高,更新效率高,插入和删除前面的数据效率低,要移动位置linkedlist查询效率低,插入和删除相较于arraylist较高。...
2021-03-09 15:35:18 93
原创 设计模式-jdk动态代理
jdk动态代理 //代理工厂 publicclassProxyFactory { privateObject targetObj; publicProxyFactory(Object targetObj) { this.targetObj = targetObj; } /** * jdk动态代理 一定需要代理对象实现接口 * 区别...
2021-03-09 15:22:59 77
原创 设计模式-单例-懒加载
单例双if判断 publicclassSingletonDemo { //双if判断 /** * 一定要使用volatile,volatile的作用 * 1.保证内存可见性 * 2.禁止指令重排 * <p> * 创建一个对象可以分为3部分 * a.分配对象内存空间 * b.在堆内存中初始化各种变量 ...
2021-03-09 15:21:10 157
原创 设计模式-装饰者模式
io中的装饰者1.inputstream是抽象类,是一个基类2.FileInputStream是inputstream的子类,是具体的被装饰者3.FilterInputStream是inputstream的子类,是装饰者的基类,类似咖啡样例中的Decorate类4.DataInputStream是FilterInputStream的子类,是具体的装饰者,类似咖啡样例中的Milk5.FilterInputStream中有protected volatile InputStream in;即...
2021-03-09 15:17:38 188
原创 注解
注解基本概念注解(元数据)为我们在代码中添加信息提供一种形式化的方法,我们可以在某个时刻非常方便的使用这些数据。将的通俗一点,就是为这个方法增加的说明或功能。例如:@Overvide这个注解就用来说明这个方式重写父类的。/*** @author zhuhuiqing* @desc* @date 2020/12/22 4:02 PM*/@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@D...
2021-03-09 15:06:14 64
原创 反射
什么是反射?反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。不带Declared的可以得到本类和父类的public的方法使用带Declared的可以得到本类的 private default protected public 得不到父类的任何属性想获取父类的属性可以Class superclass = clazz.getSuperclass();获取class对象 在 Java API 中,获取 Class 类对象有三种方法: ...
2021-03-09 13:09:21 64
原创 lambda学习
核心函数 //方法 传一个类型,返回一个类型Function<String,Integer> fun = s -> Integer.parseInt(s);System.out.println(fun.apply("12"));//消费 传一个参数,没有返回类型Consumer<String> consumer = (s) -> { System.out.println("打印" + s); System.out.println("打
2021-03-09 13:02:14 74
原创 dns
在输入www.baidu.com后,浏览器会自动在末尾加上.域名www.baidu.com.根域 .顶级域 com二级域 baidu三级域 wwwdns的解析过程1.客户机首先查看本地的host文件是否有解析记录(ip和域名映射),有者直接用来访问2.没有则向网卡中记录的首选DNS(本地DNS)发起查询请求,本地DNS的ip地址会保存在机器的网卡配置文件中,3.本地DNS服务若有记录则返回给客户端,客户端接受到后用来访问4.若没有,则本地dns向根域服务器发起请求,请...
2021-03-08 19:06:18 93
原创 git操作
git基本命令git statusgit initHEAD^上一个版本git reflog //查看历史版本,获得版本号//前进或后退git reset --hard 9a9sagit reset --hard HEADgit reset --hard HEAD^–soft //仅仅在本地库移动HEAD指针 //本地库为commit该版本之后的数据–mixed //在本地库移动HEAD指针;重置暂存区; //只有添加或删除才会触发暂存区,(默认选项,优先选用)–hard //在本地库移
2021-03-08 11:00:47 87
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人