冒泡排序算法 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...
选择排序 //选择排序public static void selectSort(int[] arr) { //选择排序 从第一个元素与后面的所有元素相比较,找到最小的一个值,与第一个元素相比较,然后进行替换 //在从第二个元素开始 // for (int i = 0; i < arr.length - 1; i++) { //最小值的下标 int minIndex = i; for (int j = i + 1;...
插入排序 /** * 从数组的第二位开始遍历每一个元素 * 对遍历的每一个元素都与前面的元素进行比较,如果比前面遍历到的元素要小,就进行移位 * 在进行遍历的时候,左边的元素都是一个有序的数组 * * 插入排序 * @param arr */public static void insertSort2(int[] arr) { //移位 //补位 for (int i = 1; i < arr.length; i++) { int temp = ...
快速排序 /** * 快速排序 * 传过来一个数组和需要排序的起始下标和终止下标 * 以数组的起始下标的值做为基准点 * 从右边起,进行判断,都是大于基准值的,当存在一个小于基准数的,记录下标 * 从左边起,进行判断,都是小于基准值的,当存在一个大于基准数的,记录下标 * * 将以上的两个值进行对调 * 将对调后左边的值与第一个值进行对调 * 这样对于左边的数据,都是小于该值的,对于右边的数据,都是大于该值的, * 将该数值分为两段,进行递归操作,往返进行,得到排序后的值 * ...
堆排序 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...
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...
阻塞队列--生产者消费者-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...
阻塞队列 阻塞队列可以认为是一个容器当阻塞队列是空的时候,从队列中获取元素的操作将会被阻塞当阻塞队列是满的时候,从队列中插入元素的操作将会被阻塞阻塞队列继承关系 collection queue blockingqueue (接口) arrayblockingqueue 由数组结构组成的有界阻塞队列 linkedblockingqueue 有链表结构组成的有界(但大小默认是m...
锁相关-cas和AtomicStampedReference 悲观锁、乐观锁乐观锁与悲观锁并不是特指某个锁,而是在并发情况下保证数据完整性的不同策略。是一种理念悲观锁具有强烈的独占和排他特性。它指的是对数据被外界修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态传统关系型数据库里面的很多锁就是采用的这种机制,例如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。java里面的synchronize和ReentrantLock等重入锁就是采用的这种机制;乐观锁总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改...
线程安全集合类 使用线程不安全的集合在多线程下会发生异常java.util.ConcurrentModificationException例如arraylist hashmapArraylista.可以使用线程安全的相关集合类 List<String> list =Collections.synchronizedList(new ArrayList<>()); Map<Object, Object> objectObjectMap =Collections...
生产者消费者-lock-condition 虚假唤醒在使用condition.await();方法时,应将该方法放入循环中,避免虚假唤醒,await()方法,线程等待,并且释放锁的资源,在其他线程调用notifyall方法,并且抢到资源后,继续执行后面的程序;在使用if判断条件进行线程是否等待时,会有多个线程在此处等待,在其他线程进行唤醒的时候,在此处等待的两个线程会连续唤醒,执行后续的程序导致不符合预期,这个现象叫做虚假唤醒。 在唤醒线程后,需要进行一次判断条件是否满足,故需要将awite放在while循环中。在api中会明确的指出
多线程卖票-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...
创建线程池 //创建固定线程数的线程池Executor threadPoolFixed = Executors.newFixedThreadPool(3);//创建一个线程的线程池Executor threadPoolSingle = Executors.newSingleThreadExecutor();//创建缓存的线程池ExecutorService executorCache = Executors.newCachedThreadPool();try{ for (int i = 0;...
使用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...
volatile volatile是什么轻量级的同步机制1.保证可见性2.不保证原子性3.禁止指令重拍主内存,线程的工作内存线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝到自己的工作内存中,然后对变量操作,操作完成后,在将变量写回主内存,不能直接操作主内存中的变量volatile保证可见性,当一个线程修改了变量后,可以及时的通知到其他的线程volatile不保证原子性i++的流程启动多个线程进行i++操作时,执行结果并不符合预期,对i++进行分析主内存.
ReadWritLock-demo ReadWritLock基础用法 public class TestReadWritLock { public static void main(String[] args) { ReadWriteLock2 readWriteLock = new ReadWriteLock2(); new Thread(new Runnable() { @Override public void run() {
CountdownLatch和CyclicBarrier概念 CountDownLatch概念 CountDownLatch是一个同步工具类,可以理解就是个计数器,只能减不能加,同时它还有个门闩的作用,当计数器不为0时,门闩是锁着的;当计数器减到0时,门闩就打开了。CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可...
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++...
多线程常用总结 list集合使用写时复制类来避免并发问题CopyOnWriteArrayList copy = new CopyOnWriteArrayList(); 非静态方法的锁为this 静态方法的锁为class实例 某一个时刻,只能有一个线程持有锁,不管几个方法 executors i++操作 主内存 线程的工作内存 1.load将i的值拷贝到自己的工作内存中 2.对i的值进行加1 3.将修改后的i的值写回到主内存中...
mysql锁 表锁、行锁表锁:偏向于myisam 锁的粒度大,速度快,开销小,无死锁,发生锁冲突频率高myisam 偏读lock table table_name read/write //锁表 读锁和写锁unlock table_name //解锁show open tables; //查看状态, in_use = 0 表示正常读锁、写锁读锁共享写锁排他读锁 session1 session2 获取读锁 lock table table_...