多线程学习
多线程学习
来日方长-zhq
写的东西大多是从网上搜到的,并加入了自己的理解,仅做为学习记录
展开
-
阻塞队列--生产者消费者-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 · 126 阅读 · 0 评论 -
阻塞队列
阻塞队列可以认为是一个容器当阻塞队列是空的时候,从队列中获取元素的操作将会被阻塞当阻塞队列是满的时候,从队列中插入元素的操作将会被阻塞阻塞队列继承关系 collection queue blockingqueue (接口) arrayblockingqueue 由数组结构组成的有界阻塞队列 linkedblockingqueue 有链表结构组成的有界(但大小默认是m...原创 2021-03-11 10:23:47 · 155 阅读 · 0 评论 -
锁相关-cas和AtomicStampedReference
悲观锁、乐观锁乐观锁与悲观锁并不是特指某个锁,而是在并发情况下保证数据完整性的不同策略。是一种理念悲观锁具有强烈的独占和排他特性。它指的是对数据被外界修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态传统关系型数据库里面的很多锁就是采用的这种机制,例如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。java里面的synchronize和ReentrantLock等重入锁就是采用的这种机制;乐观锁总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改...原创 2021-03-11 10:23:18 · 180 阅读 · 0 评论 -
线程安全集合类
使用线程不安全的集合在多线程下会发生异常java.util.ConcurrentModificationException例如arraylist hashmapArraylista.可以使用线程安全的相关集合类 List<String> list =Collections.synchronizedList(new ArrayList<>()); Map<Object, Object> objectObjectMap =Collections...原创 2021-03-10 10:39:45 · 287 阅读 · 0 评论 -
生产者消费者-lock-condition
虚假唤醒在使用condition.await();方法时,应将该方法放入循环中,避免虚假唤醒,await()方法,线程等待,并且释放锁的资源,在其他线程调用notifyall方法,并且抢到资源后,继续执行后面的程序;在使用if判断条件进行线程是否等待时,会有多个线程在此处等待,在其他线程进行唤醒的时候,在此处等待的两个线程会连续唤醒,执行后续的程序导致不符合预期,这个现象叫做虚假唤醒。 在唤醒线程后,需要进行一次判断条件是否满足,故需要将awite放在while循环中。在api中会明确的指出原创 2021-03-10 10:37:18 · 73 阅读 · 0 评论 -
多线程卖票-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 · 74 阅读 · 0 评论 -
创建线程池
//创建固定线程数的线程池Executor threadPoolFixed = Executors.newFixedThreadPool(3);//创建一个线程的线程池Executor threadPoolSingle = Executors.newSingleThreadExecutor();//创建缓存的线程池ExecutorService executorCache = Executors.newCachedThreadPool();try{ for (int i = 0;...原创 2021-03-10 10:34:24 · 45 阅读 · 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...原创 2021-03-10 10:32:32 · 226 阅读 · 0 评论 -
volatile
volatile是什么轻量级的同步机制1.保证可见性2.不保证原子性3.禁止指令重拍主内存,线程的工作内存线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝到自己的工作内存中,然后对变量操作,操作完成后,在将变量写回主内存,不能直接操作主内存中的变量volatile保证可见性,当一个线程修改了变量后,可以及时的通知到其他的线程volatile不保证原子性i++的流程启动多个线程进行i++操作时,执行结果并不符合预期,对i++进行分析主内存.原创 2021-03-10 10:30:14 · 112 阅读 · 0 评论 -
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 · 84 阅读 · 0 评论 -
CountdownLatch和CyclicBarrier概念
CountDownLatch概念 CountDownLatch是一个同步工具类,可以理解就是个计数器,只能减不能加,同时它还有个门闩的作用,当计数器不为0时,门闩是锁着的;当计数器减到0时,门闩就打开了。CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可...原创 2021-03-10 10:26:38 · 81 阅读 · 0 评论 -
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 · 296 阅读 · 0 评论 -
多线程常用总结
list集合使用写时复制类来避免并发问题CopyOnWriteArrayList copy = new CopyOnWriteArrayList(); 非静态方法的锁为this 静态方法的锁为class实例 某一个时刻,只能有一个线程持有锁,不管几个方法 executors i++操作 主内存 线程的工作内存 1.load将i的值拷贝到自己的工作内存中 2.对i的值进行加1 3.将修改后的i的值写回到主内存中...原创 2021-03-10 10:22:27 · 53 阅读 · 0 评论