java
文章平均质量分 71
冉航--小虾米
如果技术不能换来金钱,那么就让它换来精神生活。
展开
-
线程并发相关的原子操作类
#线程并发原子操作类何为原子性,就是一次性操作完成,在操作变量的时候,其它线程不能操作变量,也就是我们之前说的synchronized同步关键字的作用。这节我们不用synchronized,而是用系统API中的原子类,今天我们以其中一个AtomicInteger类为例来讲解。比如我们有20个人同时卖票,每人卖1000张,问最后总共卖了多少张?这里先给出答案:20000张。我们来看下代码如何编写,20个人相当于20个线程,然后每个线程内for循环1000次,每次给票数加1,那么java代码就是:模拟2原创 2022-01-31 00:00:00 · 1302 阅读 · 0 评论 -
线程范围内共享变量,使用ThreadLocal API来实现
1.回顾上节我们讲了线程共享范围内的共享变量,我们使用了一个Map(K,V),其中Key为正在执行的线程对象,value存储的是线程操作的变量,如一个int型的data,我们以key来区分是哪一个对象所操作的变量。这一节我们将使用ThreadLocal 这个线程范围内共享变量的专用API来实现。2.使用ThreadLocal实现2.1 使用ThreadLocal实现基本数据类型在线程范围内共享使用ThreadLocal实现线程范围内的共享变量。代码如下:public class ThreadSha原创 2022-01-24 14:12:41 · 1266 阅读 · 0 评论 -
线程范围内的共享变量
1. 线程范围内的共享变量的概念 假设有2个线程,一个全局变量 int data。2个线程内的代码共用这一个变量的声明(data),但它们操作data时,data的值在这2个线程里是独立的,互不影响的。我们这里所说的互不影响,不是我们之前说的syncronized,(线程1先修改data值,读取data值,释放锁后,线程2才可修改data和读取data,这样的话data最终的值还会变为线程2最后修改的值)。我们现在要实现的是,线程1修改了data=1, 线程2也修改了同一个data变量...原创 2022-01-22 14:04:04 · 3817 阅读 · 1 评论 -
线程间的通信notify与wait
今天我们来聊一下线程间的通信。这里的通信指的是通俗意义上的“通个信儿”或者“通个气儿”,不是说要传递什么数据,更多的含义是“通知对方”。我们现在来做一个2个动物参与的小游戏,在这里两个动物分别是猫和狗。先让猫跑10步,然后狗才能跑步,也是跑10步。要注意的是: 当猫10步还未跑完的期间,狗决不能跑动,只有当第1个猫把10步跑完后,狗才能开始跑,也是跑10步。我们用代码如何来模拟这个过程呢?我们简单的执行2个for循环便是:package testFuture;public class Th原创 2022-01-07 23:26:53 · 1318 阅读 · 0 评论 -
线程同步工具Exchanger
package cn.itcast.heima2;import java.util.concurrent.Exchanger;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ExchangerTest { public static void main(String[] args) { ExecutorService service...原创 2021-08-02 09:50:30 · 1078 阅读 · 0 评论 -
用BlockQueue实现线程间的通信,子线程执行完了主线程执行,主线程执行完了子线程执行
package cn.itcast.heima2;import java.util.Collections;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.atomic.AtomicInteger;public class BlockingQueueCommunication { /** *...原创 2021-08-02 09:48:13 · 1131 阅读 · 0 评论 -
Hashmap与HashSet的关系
Hashset内部是 由Hashmap构造的,只用到了Hashmap的key。见Hashset的源码:public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable{ static final long serialVersionUID = -5024744406713321676L; priva原创 2021-06-19 19:49:29 · 1437 阅读 · 0 评论 -
BlockQueue阻塞队列实现之前的消费者生产者模式condition
package testFuture;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;public class BlockingQueueTest { public static void main(String[] args) { final BlockingQueue queue = new ArrayBlockingQueue(3); ...原创 2021-06-19 19:21:44 · 1159 阅读 · 0 评论 -
线程工具Semaphore
Semaphore信号灯,也是实现多线程间互斥的。多个线程只有拿到了这盏灯,才能执行下面的代码,相当于lock、sychronized; 当一个线程拿到了这盏灯后,其它线程将暂停等待,直到这个线程执行完毕释放灯。当然信号灯可以有多盏灯,如有3盏灯,然后10个线程去执行代码,这期间只能有3个线程拿到灯,可以执行。当有线程释放了1个灯后,其它7个线程当中才能有一个线程冲过去抢到灯。示例代码如下:package cn.itcast.heima2;import java.util.concurrent.原创 2021-05-15 17:34:58 · 1220 阅读 · 0 评论 -
线程工具CyclicBarrier
package testFuture;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CyclicBarrierTest { public static void main(String[] args) { ExecutorService servi...原创 2021-05-15 17:12:11 · 1187 阅读 · 0 评论 -
一个经典的多线程condition使用实例代码,请评论
class BoundedBuffer {final Lock lock = new ReentrantLock();final Condition notFull = lock.newCondition();final Condition notEmpty = lock.newCondition();final Object[] items = new Object[100];int putptr, takeptr, count;public void put(Object x) throw原创 2021-05-02 17:20:50 · 1282 阅读 · 0 评论 -
线程-读写锁。
读写锁。我们上次温习了synchronized与Lock.我们遗留了一个问题,就是想让读读不互斥,因为多线程同时读取数据并不会破坏数据。如果能实现读读不用互斥,那将大大提升了多线程读性能。于是我们引入了读写锁ReentrantReadWriteLock。ReentrantReadWriteLock可以专门创建一个读锁和写锁。读锁:读读不互斥,但是读写互斥。 写锁:不但读写互斥,而且写写也互斥。创建一个读写锁 ReadWriteLock rwl = new ReentrantReadWriteLoc.原创 2021-05-02 15:55:16 · 1250 阅读 · 0 评论 -
线程Lock
我们之前学习了synchronized,今天来介绍一下lock。lock与synchronized一样都是为了多线程在竞争公共资源时,能不发生冲突,就是一个线程获取了锁,就去执行代码块,其它线程只能等待第一个线程执行完同步代码块,才能有机会获取到synchronized锁对象。 lock与synchronized最大的区别是,lock锁的释放需要程序员手动调用unlock,一般放在要同步的代码的最后调用unlock,或者try..catch..finally中的finally里调用unlock。当然,.原创 2021-04-24 17:30:19 · 1352 阅读 · 0 评论 -
Callable与Futrue.get()等待线程执行完毕
1. 等待一个子线程执行完毕public static void main(String[] args) { ExecutorService threadPool = Executors.newSingleThreadExecutor(); Future<String> future = threadPool.submit( new Callable<String>() { public String call() throws Excepti原创 2021-04-17 19:35:07 · 2768 阅读 · 0 评论 -
线程池回顾
线程池:一个池子里创建1个或多个线程,通常往这个池子里扔进去多个任务,然后多个线程会抢着执行这些任务,如果一群狼共同吃掉这些羊群(多个任务)。1. 创建线程池目前我了解的创建线程池有4种方式: (1)线程池里的线程数是固定不变的;(2)线程池里只有1个线程池;(3)线程池里的线程数是动态变化的;(4)定时执行任务的线程池。接下来我们就依次介绍一下上述4种创建线程池的方式。1.1 线程池里的线程数是固定不变的。 创建方式:ExecutorService threadPoolFixed...原创 2021-04-11 22:20:50 · 1300 阅读 · 0 评论 -
java thread study
0. 用runnable创建线程具有面向对象的思想。1. quartz 定时器开源库。3. 多线程间的互斥:(1)多线程间的互斥,用synchronized关键字,两个线程用互斥锁必须用同一个对象才能实现互斥。(2) 两个非静态函数前加synchronized关键字,它们的公用锁是this,就是当前对象实例。(3)静态函数前加synchronized关键字,它用的锁对象是...原创 2021-03-27 12:00:32 · 1230 阅读 · 0 评论 -
多线程温习2. 多线程之间的同步
现在我们要启动2个线程,第一个线程打印“gaoxiaowei”中的每一个字符,然后换行; 第二个线程打印“zhangwenbin”的每一个字符然后换行,代码如下:public class TraditionalThreadSynchronized { /** * @param args */ public static void main(String[] args) { new TraditionalThreadSynchronized().init(); } privat原创 2020-05-14 17:13:59 · 1786 阅读 · 0 评论 -
多线程温习1--创建java线程的两个方法
如何开启一个线程?方法1: Thread thread = new Thread(){ @Override public void run() { while(true){ try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("1:" + Thread.curre原创 2020-05-14 16:15:42 · 1705 阅读 · 0 评论