java中并发常用工具类

98、Java 常用工具类及并发包详解 本文详细介绍了 Java 中常用的工具类及并发包 java.util 和 java.util.concurrent 中的关键类和接口。内容涵盖 TreeMap 与 TreeSet 的排序特性、UUID 的唯一标识符生成、Vector 与 ArrayList 的性能对比、WeakHashMap 的内存管理机制,以及 java.util.concurrent 包提供的线程安全集合、线程池和同步工具。文章通过代码示例说明各类的使用方法,并分析了不同场景下的最佳实践和性能优化策略,帮助开发者在实际项目中高效地使用 阅读详情

前言:在你无聊的时候,想想比你优秀还努力的人,也许就不觉的无聊了

今天下午没事干把买的java并发编程艺术这本书拿出来看了看,看了下也记不住,还是好记性不如烂笔头,今天讲四个并发中可能会用到的工具类,分别是:

CountDownLatch

CyclicBarrier

Semaphore

Exchanger


CountDownLatch

countDownLatch允许一个或多个线程等待其他线程完成操作.比如说有三个线程分别是老二,老大,老爸,这三个线程必须是老二吃好了,老大吃,老大吃完了,老爸吃,在20年钱,农村家里穷,一般有好吃的都是先留个最小的,然后才给其他兄弟姐妹吃,都不吃了,才由我们的父母吃,所以父母都不容易了,为了儿女,虽然是多个线程但是确实线性的,


我同事面试别人就问过好几次这个问题,在java或者android中常用的有2个方式实现

第一种方式:

使用jdk中Thread自带的函数join实现,join()用于当前执行线程等待join线程执行结束,其实实现原理是不停检查join线程是否存活,如果join线程存活则让当前线程永远等待,其中,wait(0)表示永远等待下去,join在jdk中的是实现方式如下:

/**
     * Waits for this thread to die.
     *
     * <p> An invocation of this method behaves in exactly the same
     * way as the invocation
     *
     * <blockquote>
     * {@linkplain #join(long) join}{@code (0)}
     * </blockquote>
     *
     * @throws  InterruptedException
     *          if any thread has interrupted the current thread. The
     *          <i>interrupted status</i> of the current thread is
     *          cleared when this exception is thrown.
     */
    public final void join() throws InterruptedException {
        join(0);
    }
直到join线程中止后,线程的this.notifyAll()方法会被调用,调用notifyAll()方法是在JVM里实现的,现在把上面的例子用代码实现下:
package com.thread;
public class RunnableJob {
   public static void main(String[] args) throws InterruptedException {
	   Worker runnableJob = new Worker();
       Thread t1 = new Thread(runnableJob, "老二");
       Thread t2 = new Thread(runnableJob, "老大");
       Thread t3 = new Thread(runnableJob, "老爸");
       t1.start();  
       t1.join();  
       t2.start();  
       t2.join();  
       t3.start();  
       t3.join();  
       System.out.println("主线程执行完毕----");  
  }
}
class Worker implements Runnable{
	public void run() {
        Thread thread = Thread.currentThread();
        try {
            Thread.sleep(5000);
            System.out.println(thread.getName()+"吃完了");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
log:



CountDownLatch是一个同步计数器,现在有个需求,在古代是男人先吃饭,特别是有客人在的时候,女人不能上桌,等待男人吃完,女人才能上桌吃饭,

package com.thread;
import java.util.concurrent.CountDownLatch;
public class CountDownLatchTest {
	public static void main(String[] args) {
		 final CountDownLatch countDownLatch = new CountDownLatch(3); 
		 new Thread("老二"){
             public void run() {
                 try {
                    Thread.sleep(3000);
                    System.out.println(Thread.currentThread().getName()+"吃完了");
                    countDownLatch.countDown();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
             };
         }.start();
         new Thread("老大"){
             public void run() {
                 try {
                    Thread.sleep(3000);
                    System.out.println(Thread.currentThread().getName()+"吃完了");
                    countDownLatch.countDown();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
             };
         }.start();
         new Thread("老爸"){
             public void run() {
                 try {
                    Thread.sleep(3000);
                    System.out.println(Thread.currentThread().getName()+"吃完了");
                    countDownLatch.countDown();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
             };
         }.start();
         System.out.println("等待三个男人吃完,女人才能上桌吃饭,等....");
         try {
			countDownLatch.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
         System.out.println("女人们可以上桌吃饭了");
	}
}
运行结果:


你会发现CountDownLatch和join还是有区别:

相同点:都能等待一个或者多个线程执行完成操作,比如等待三个线程执行完毕后,第四个线程才能执行

不同点:join能让线程按我们预想的的顺序执行,比如线程1执行完了,线程2才能执行,线程2执行完,线程3才能执行,但是CountDownLatch就做不到.

如果查看CountDownLatch源码,发现这源码还是很少的,没几行代码,方法也就几个:CountDownLatch的构造函数接受一个int类型的参数作为计时器,如果你想等待N个点完成,就在这里传入N

当我们调用CountDownLatch的countDown方法时,N就会减1,CountDownLatch的await方法会阻塞当前线程,直到N变为零(也就是线程都执行完了),由于countDown方法可以用在任何地方,所以这里说的N个点,可以是N个线程,也可以是1个线程里的N个执行步骤。用在多线程时,只需把这个CountDownLatch的引用传递到线程中即可,

当然阻塞还有一个重载的方法就是await(long timeout, TimeUnit unit) 阻塞的时间,超过这个时间就不等待了.

注意点:

计时器必须大于等于0,只是等于0的时候,计时器就是0,调用await()方法时,不会阻塞当前线程,CountDownLatch不可能重新初始化或者修改CountDownLatch对象的内部 计数器的值,不可逆性.

Semaphore

semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源.这个跟队列有点像,画图理解更直观,


代码:

package com.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class SemaphoreDemo {
	public static void main(String[] args) {  
        ExecutorService service = Executors.newCachedThreadPool();  
        final Semaphore semaphore = new Semaphore(2);  
        final int count = 5;  
        for (int i = 0; i < count; i++) {  
            Runnable runnable = new Runnable() {  
                public void run() {  
                    try {  
                        semaphore.acquire();  
                        System.out.println("线程:" + Thread.currentThread().getName()+"开始下载");  
                        Thread.sleep(5000);  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    } finally {  
                        System.out.println("线程:" + Thread.currentThread().getName() + "下载完毕");  
                        semaphore.release();  
                    }  
                }  
            };  
            service.execute(runnable);//放在线程池中去维护
        }  
        service.shutdown();  
    }  
}
运行结果:


发现我们并发下载的数量是只允许2个线程,当访问总线程大于2时,其他线程就要等待,Semaphore类常用的方法:

acquire():获取一个许可证,

release():释放许可证,这时候有多余的线程就加入到线程池中

tryAcquire():尝试获取许可证

intavailblePermits():返回此信号量当前可用的许可证数

intgetQueueLength():返回正在等待获取许可证的线程数

hasQueuedThreads():是否有线程正在等待获取许可证

reducePermits(int reduction):减少reduction个许可证,

getQueueThreads():返回所有等待获取许可证的线程集合

Semaphore类的构造函数中传入的数,表示同时并发访问控制在多少个线程.


Exchanger

exchanger是一个用于线程间协作的工具类,Exchanger用于进行线程间的数据交换,它提供一个同步点,在这个同步点,二个线程可以交换彼此的数据.在这二个线程通过exchange方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也执行exchange方法,当二个线程都达到同步点时,这二个线程就可以交换数据,将本线程生产出来的数据传递给对方.

打个比方吧,发现我们那农村结婚是需要30,40万,这对一般的家庭确实是一个很大的钱,因为农村没读书的孩子多是 21~23之间就要讨老婆了,这么年轻自己打工赚到30万还是很少很少的,哪女孩一般会说等你赚到了30万马上给你结婚,于是只好苦逼的年复一年的工作,每个月把打工的钱给女孩,到了30万马上通知男方说可以结婚了,


现在用代码实现下:

package com.thread;
import java.util.Random;
import java.util.concurrent.Exchanger;
public class ExchangerDemo {
	 public static void main(String[] args) {  
	        Exchanger<Integer> exchanger = new Exchanger<>();  
	        new Girl(exchanger).start();  
	        new Man(exchanger).start();  
	    }  
}
/**
 * 男人
 * @author admin
 */
class Man extends Thread {  
    Exchanger<Integer> exchanger = null;  
    public Man(Exchanger<Integer> exchanger) {  
        super();  
        this.exchanger = exchanger;  
    }  
    @Override  
    public void run() {  
        Random rand = new Random();
        int money = 0;
        for(int i=0;i<4;i++){
        	money+=100000;//年薪在10万以内
        	try {
				exchanger.exchange(money);//存钱
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
        }
    }  
}  
/**
 * 女人
 */
class Girl extends Thread {  
    Exchanger<Integer> exchanger = null;  
    int money = 0;
    public Girl(Exchanger<Integer> exchanger) {  
        super();  
        this.exchanger = exchanger;  
    }  
    @Override  
    public void run() {  
    	for(int i=0;i<4;i++){
    		try {
				money = exchanger.exchange(money) ;
				System.out.println(money>300000?"亲爱的"+money+"万我们可以结婚了":money+"块这么少,"+"臭屌丝活该单身,还不去赚钱娶老婆");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
    	}
    }  
} 

运行结果:


Exchanger主要用于二个线程之间交换数据,注意,只能是2个线程,如果有一个线程没执行exchange()方法,则会一直等待,线程就处于阻塞状态了!如果怕一直等待,可以设置时间:exchange()有一个重载的方法.

exchange(V x, long timeout, TimeUnit unit)

CyclicBarrier

CyclicBarrierr如果你在翻译的话是关卡,栅栏的意思,也就是被卡住在哪里,还可以把这个词扯开成cyclic和barrier,cyclic是循环的意思,barrier是障碍的意思,从字面意思连起来读就是可循环的障碍,翻译成java语言就是当有几个线程同时去访问,要阻塞,直到最后一个线程达到屏障时,程序才会继续执行,

CyclicBarrier使用也很简单,首先它有2个构造函数:

public CyclicBarrier(int parties):parties一个int类型参数,表示屏障拦截的线程数量,

public CyclicBarrier(int parties,Runnable barrierAction),意思是在线程到达屏障时,优先执行barrierAction线程.

打个比方吧,你们主管带领小明,小王经过2个月的日夜工作,完成了一个重要的项目,领导准备奖励你们项目组一些钱,让你们出去玩,主管,小明,小王呢?经过思考,去xxx天上人间玩下吧,他们约好在万达商场见面,车子已经提前安排好了,所以只有三个人都到了,才上车.

来个图片赏析下:


代码如下:

package thread;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
class Employee implements Runnable {
	 private String name;
	    private CyclicBarrier barrier;
	    public Employee(String name, final CyclicBarrier barrier) {
	        this.name = name;
	        this.barrier = barrier;
	    }
	    public void run() {
	        try {
	            System.out.println(name+"已经到达万达商场等待");
	            barrier.await(); //等待最后一个线程到达(底层会去判断)
	        } catch (InterruptedException | BrokenBarrierException e) {
	            e.printStackTrace();
	        }
	        System.out.println(name+"上车");
	    }
	}
	 public class TestCyclicBarrier {
	    public static void main(String[] args) {
	        int num = 3;
	        String[] strs = {"主管","小明","小王"};
	        CyclicBarrier barrier = new CyclicBarrier(num);
	        for (int i = 0; i <num; i++) {
	            new Thread(new Employee(strs[i], barrier)).start();
	        }
	    }
	}
运行结果:


假如在中途经理打电话来说也想去,那么三个人在等,但是到最后经理突然有急事,电话也没电了,没通知这三个哥们,那么这三个哥们也出去了,因为没有第四个线程去执行await()方法,那么之前的线程达到屏障时都不会往下执行了,也就是各自上车的行为不会执行,那还怎么去天上人间.

CyclicBarrier barrier = new CyclicBarrier(num+1);
只要把这个构造函数传入的参数+1

运行结果:


这就是这三个人被经理放了鸽子了,一直等待,等到天荒地老也到不了天上人间!直到天上人间被查了,呵呵.
CyclicBarrier有2个构造函数,第二个构造函数第二个参数传递的一个Runnable,意思这个线程先执行

现在有个生活场景,就是聚餐,一般聚餐之前领导都要先说几句然后才能开始吃,

代码如下:

package thread;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class TestCyclicBarrierDemo {
	public static void main(String[] args) {
		int num = 5;
		CyclicBarrier barrier = new CyclicBarrier(num,new Leader());
		for (int i = 0; i <num; i++) {
			new Thread(new Employee( barrier)).start();
		}
	}
}
class Leader implements Runnable{
	@Override
	public void run() {
		System.out.println("吃饭前我先说几句");
		try {
			Thread.sleep(5000);//说了半个小时  比如吧
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
class Employee implements Runnable {
	    private CyclicBarrier barrier;
	    public Employee(final CyclicBarrier barrier) {
	        this.barrier = barrier;
	    }
	    public void run() {
	        try {
	            System.out.println("都在等领导说完话准备吃");
	            barrier.await(); 
	        } catch (InterruptedException | BrokenBarrierException e) {
	            e.printStackTrace();
	        }
	        System.out.println("说了30分钟准备用筷子开始吃了");
	    }
	}

运行结果:


现在讲下CyclicBarrier和CountDownLatch的区别:

CountDownLatch的计数器只能使用一次,而CyclicBarrier的计数器可以使用reset()方法重置,所以CyclicBarrier能处理的业务场景相对CountDownLatch更多,


案例分析|一篇文章带你看懂养鸡场智慧管理系统 养鸡场智慧管理系统是为了满足现代化养鸡业对精细化管理的需求而设计的一款专业软件。随着科技的发展和农业产业的升级,传统的手工记录和管理方式已无法满足高效、准确和实时的数据跟踪需求。本软件旨在通过集成各种功能模块,帮助养鸡场主实现从鸡苗孵化、饲养管理、饲料控制到销售结算等全链条的智能化操作。该系统的核心目标是提升养鸡场的运营效率和盈利能力,通过自动化数据处理,减少人工误差,节省时间和精力。例如,孵化报表和记录模块可以帮助管理者实时监控孵化过程,及时调整策略; 阅读详情

相关推荐

AI赋能工业自动化:传感器大数据实战

工业自动化中AI与传感器大数据的结合,显著提升了生产效率与可靠性。关键技术包括实时数据处理、边缘计算和数字孪生,未来将进一步向自主决策系统演进。

AFAGA_x的博客 413

JAVA之常用的工具类

目录 1 org.apache.commons.io.IOUtils 2 org.apache.commons.io.FileUtils 3org.apache.commons.lang.StringUtils 4 org.apache.http.util.EntityUtils 5 org.apache.commons.lang3.StringUtils 6 org.apache....

上善若泪 3万+

使用Avalonia跨Linux平台

Avalonia类似使用WPF的技术方法来开发,所以,需要会使用WPF,其中的一些语法和写法与WPF有所区别,但是他们相差不大,会WPF的话,基本上可以看看文档后,完全掌握Avalonia的使用,从而达到跨平台开发的任务。其实写法有些不一样,可以参考官网的说明,进行修改。2. 安装完成后,重启VS2022,我们可以看到1和2,其中1是使用MVVM模式开发,2是普通模式开发,我们选择2,建立项目。9.直接双击粉红色的文件,进行安装,输入密码,但是美中不足的是,好像没有图标,图标似乎需要单独去设置。

故里2130 1万+

java常用工具类

在Java和Spring Boot项目开发中,常用的公用工具类有以下几种类型:1. 字符串处理工具类:包含常见的字符串操作,如字符串拼接、分割、替换、转换大小写等。2. 时间日期工具类:提供日期的格式化、解析、计算、比较等功能,方便处理日期时间相关操作。3. 文件操作工具类:提供文件的创建、复制、删除、移动、重命名等操作,以及读取、写入文件内容的方法。4. 数据校验工具类:包含常见的数据校验方法,如判断是否为空、是否为数字、是否为邮箱等。

weixin_47425074的博客 3936

四足机器人关节电机FOC控制实战:从磁编码器校准到SVPWM调试避坑指南

本文详细解析了四足机器人关节电机FOC控制实战,涵盖磁编码器校准、电流环调试和SVPWM波形优化等关键环节。通过MIT Cheetah案例展示如何解决21倍电气误差问题,并提供相序自动校正、PI参数整定等实用代码片段,帮助工程师避开永磁同步电机(PMSM)控制中的常见陷阱。

weixin_29281915的博客 489

PyTorch+C3D实战:用UCF101数据集训练你的第一个视频动作识别模型(附完整代码)

本文详细介绍了如何使用PyTorch和C3D模型在UCF101数据集上构建视频动作识别系统。从环境配置、数据预处理到模型训练与优化,提供了完整的代码实战指南,帮助开发者快速掌握视频行为识别技术。文章特别强调了3D卷积核设计、混合精度训练等关键技术要点,并分享了模型部署优化经验。

weixin_29233857的博客 218

JAVA工具类

7.1.1 Java基础类库。

weixin_68351124的博客 1620

SIwave仿真手册——信号完整性仿真之S参数的提取(二)

上一篇简单了讲述了软件的各个操作界面,本次博客更新关于的仿真,因为第二章完整的内容比较多,所以分成好几篇博客进行分享。

luohuo9844的博客 1万+

JAVA常用的工具类

我们都知道,java中的很多集合,比如:ArrayList、LinkedList、HashMap、HashSet等,都是线程不安全的。中传递信息,比如:traceId,source等,便于在查询日志时能够串联一次完整的请求链路,快速定位问题。包下的一个类,它的全称是Mapped Diagnostic Context,我们可以认为它是一个线程安全的存放诊断日志的容器。**接口,MDC中获取当前请求的traceId,然后设置到header中。**方法,将这些线程不安全的集合,直接转换成线程安全集合。

java程序员 3771

YOLO26中的PPM空间金字塔池化:改良设计与多尺度特征提取教程

在计算机视觉的语义分割任务中,准确理解图像中的上下文信息至关重要。例如,在街景图像中,可能同时存在远处的小汽车和近处的大建筑物,网络需要具备捕获多尺度上下文信息的能力。例如,要正确识别图像中的"船",不仅需要看到船本身的特征,还需要理解周围的水面环境。金字塔的每一层对应不同的池化尺度,从细粒度到粗粒度,形成了多层次的特征表示。PPM(Pyramid Pooling Module)正是为了解决这一问题而提出的模块,它通过构建金字塔形状的池化结构,有效地聚合不同尺度的上下文信息,从而提升语义分割的精度。

LXY_LOVE36的博客 82

Diffusion Models扩散模型与深度学习(数学原理和代码解读)

​ 此前GANs霸占各大顶会很多年,DDPM的出现让人耳目一新!经过这两年的发展,Diffusion Models能在图像生成、超分辨率重建、点云生成、语音生成等领域达到SOTA。这篇文章旨在帮助没有了解过的读者入门,《Diffusion Models与深度学习专栏》已经写了将近三十篇文章,既有原理公式和必备基础知识的讲解,也有代码详细实战解读,还有前沿热门应用,欢迎读者订阅。

沉迷单车的追风少年 4万+

java中的常用工具类

java中常用的工具类总结

weixin_43871857的博客 3199

CANoe如何实现TLS协议

TLS,Transport Layer Security,传输层安全协议。是在传输层和应用层之间,为了保证应用层数据能够安全可靠地通过传输层传输且不会泄露的安全防护。

jasonj333 1159

java 并发包常用工具类

开始。

weixin_43548271的博客 1055

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java中的并发编程模型和常用工具类

Java中的并发编程模型基于线程和锁机制。Java中的线程是轻量级的进程,每个线程都有自己的执行路径,可以独立执行任务。Java中的锁机制可以保证多个线程之间的同步和互斥,避免资源竞争和冲突。Java中的线程和锁机制是Java并发编程的基础。synchronized关键字和Lock接口的使用 synchronized关键字和Lock接口是Java中的两种锁机制,它们可以保证多个线程之间的同步和互斥。synchronized关键字是Java中最常用的同步机制,它可以用来修饰方法或代码块。

小易 618

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

java中的并发类_java中并发常用工具类

前言:在你无聊的时候,想想比你优秀还努力的人,也许就不觉的无聊了今天下午没事干把买的java并发编程艺术这本书拿出来看了看,看了下也记不住,还是好记性不如烂笔头,今天讲四个并发中可能会用到的工具类,分别是:CountDownLatchCyclicBarrierSemaphoreExchangerCountDownLatchcountDownLatch允许一个或多个线程等待其他线程完成操作.比如说有...

weixin_30171859的博客 131

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java中并发常用工具类

来源于:https://blog.youkuaiyun.com/coderinchina/article/details/54914852 CountDownLatch Semaphore(信号量) CountDownLatch countDownLatch允许一个或多个线程等待其他线程完成操作。 通过构造函数来确定线程数 final CountDownLatch countDownLatch = new CountDownLatch(3); 通过.countDown()来使同步计数器减1 countDownLa

weixin_40805537的博客 213

java并发常用工具类

java并发工具类的使用

huangzhigao886的博客 534

java中并发常用工具类及示例代码

前言:在你无聊的时候,想想比你优秀还努力的人,也许就不觉的无聊了 今日记录:四个并发中可能会用到的工具类,分别是: CountDownLatch CyclicBarrier Semaphore Exchanger CountDownLatch 是一组线程等待其他的线程完成工作以后在执行,加强版join 区别在于: 调用thread.join() 方法必须等thread 执行完毕,当前线程才能继续往下执行 而CountDownLatch通过计数器提供了更灵活的控制,只要检测到计数器为0当前线程就可以往下执

poker_zero的博客 2919

Java 并发常用工具类

很多情况下 程序的主线程在做一项工作之前需要一系列的准备工作,只有这些准备工作都完成,主线程才能继续它的工作, CountDownLatch允许一个或多个线程等待另外N个线程完成某个操作之后才能执行这个类似Thread里的join()的功能。当某一个或多个线程start()以后, 用join()去等待。必须对应的线程执行完毕,join()后续的代码才能继续执行下去,CountDownLatc...

woi123的专栏 192

Java线程并发常用工具类使用

这次整理了一些比较常用的线程工具类啦。 CountDownLatch:在一组线程执行完后,才能开始执行调用等待的线程。上片文章提到过junit的测试尽量不要测试线程,如果硬是要可以使用CountDownLatch进行测试 CyclicBarrier:在一组线程中调用等待方法后,只有这组所有线程都进入等待后,会执行一个指定的线程,在指定的线程执行完后,这组等待的线程才能继续执行。 Semaphore:可用于限流使用。 Exchanger:当两组线程都执行到交换的方法时,能将数据在这两个线程之间进行数据

qq_40874285的博客 304

Java并发包下常用工具类源码深度解析

如果state部位0,说明有线程已经加锁了,拿到exclusiveOwnerThread属性,判断其是否是当前线程,如果是,则state+1,返回true,表示加锁成功。① 众所周知,阻塞、唤醒线程,都是 用户态和内核态的相互转换,因此比较耗性能,在 看ReentrantLock源码,的时候,他也不上上来就加锁,在调用LockSupport.park()方法之前其实尝试获取了几次锁,都是为了避免线程被阻塞,到最到没办到了,才会阻塞线程,我数了下,一共四次,尝试获取锁。

weixin_41338970的博客 1698

hbase2.x java 工具类_java中并发常用工具类

今天来概括四个并发中可能会用到的工具类,分别是:CountDownLatchCyclicBarrierSemaphoreExchangerCountDownLatchcountDownLatch允许一个或多个线程等待其他线程完成操作.比如说有三个线程分别是老二,老大,老爸,这三个线程必须是老二吃好了,老大吃,老大吃完了,老爸吃,在20年钱,农村家里穷,一般有好吃的都是先留个最小的,然后才给其他兄弟...

weixin_39732640的博客 210

java.util.concurrent包(并发编程常用工具类)

转 http://fhd001.iteye.com/blog/480295 java.util.concurrent   软件包 java.util.concurrent 的描述   在并发编程中很常用的实用工具类。此包包括了几个小的、已标准化的可扩展框架,以及一些提供有用功能的类,没有这些类,这些功能会很难实现或实现起来冗长乏味。下面简要描述主要的组件。另请参阅 locks ...

开发笔记 318

java常用工具类详解_java常用的并发工具类有哪些?【面试题详解】

今天爱分享给大家带来java常用的并发工具类有哪些?【面试题详解】,希望能够帮助到大家。Semaphore(信号量)-允许多个线程同时访问: synchronized 和 ReentrantLock 都是一次只允许一个线程访问某个资源,Semaphore(信号量)可以指定多个线程同时访问某个资源。CountDownLatch(倒计时器): CountDownLatch是一个同步工具类,用来协调多个...

weixin_33800724的博客 237
上一篇: android 手把手教你写数据库框架(第一篇)
下一篇: android 手把手教你写数据库框架(第二篇)
zhoushenxian
博客等级 码龄12年 453粉丝 549原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值