文章 75
评论 13
浏览 21091
[转] Java并发编程:阻塞队列

[转] Java并发编程:阻塞队列

Java并发编程:阻塞队列   在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。今天我们来讨论另外一类容器:阻塞队列。   在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了Dequeue接口)。   使用非阻塞队列的时候有一个很大问题就是:它不会对当前线程产生阻塞,那么在面对类似消费者-生产者的模型时,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦。但是有了阻塞队列就不一样了,它会对当前线程产生阻塞,比如一个线程从一个空的阻塞队列中取元素,此时线程会被阻塞直到阻塞队列中有了元素。当队列中有元素后,被阻塞的线程会自动被唤醒(不需要我们编写代码去唤醒)。这样提供了极大的方便性。   本文先讲述一下java.util.concurrent包下提供主要的几种阻塞队列,然后分析了阻塞队列和非阻塞队列的中的各个方法,接着分析了阻....

[转]Java 中的阻塞队列

[转]Java 中的阻塞队列

阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。

[转] CountDownLatch详解

[转] CountDownLatch详解

CountDownLatch中count down是倒数的意思,latch则是门闩的含义。整体含义可以理解为倒数的门栓,似乎有一点“三二一,芝麻开门”的感觉。CountDownLatch的作用也是如此,在构造CountDownLatch的时候需要传入一个整数n,在这个整数“倒数”到0之前,主线程需要等待在门口,而这个“倒数”过程则是由各个执行线程驱动的,每个线程执行完一个任务“倒数”一次。总结来说,CountDownLatch的作用就是等待其他的线程都执行完任务,必要时可以对各个任务的执行结果进行汇总,然后主线程才继续往下执行。

[转] Java并发之CyclicBarrier

[转] Java并发之CyclicBarrier

java.util.concurrent.CyclicBarrier类是一个同步机制。它可以通过一些算法来同步线程处理的过程。换言之,就是所有的线程必须等待对方,直到所有的线程到达屏障,然后继续运行。之所以叫做“循环屏障”,是因为这个屏障可以被重复使用。

[转]Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

[转]Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。   以下是本文目录大纲:   一.CountDownLatch用法   二.CyclicBarrier用法   三.Semaphore用法

[转]java多线程读写锁ReadWriteLock

[转]java多线程读写锁ReadWriteLock

读写锁分为读锁和写锁,多个读锁之间是不需要互斥的(读操作不会改变数据,如果上了锁,反而会影响效率),写锁和写锁之间需要互斥,也就是说,如果只是读数据,就可以多个线程同时读,但是如果你要写数据,就必须互斥,使得同一时刻只有一个线程在操作。

[转]Java CAS操作的ABA问题

[转]Java CAS操作的ABA问题

比较并交换(compare and swap,CAS),是原子操作的一种,可用于在多线程编程中实现不被打断的数据交换操作,从而避免多线程同时改写某一数据时由于执行顺序不确定性以及中断的不可预知性产生的数据不一致问题。

[转]并发下的集合

[转]并发下的集合

由于并行程序与串行程序的不同特点,适用于串行程序的一些数据结构可能无法直接在并发环境下正常工作,这是因为这些数据结构不是线程安全的。本节将着重介绍一些可以用于多线程环境的数据结构,如并发List、并发Set、并发Map等。

[转]Java锁解析

[转]Java锁解析

Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8和Netty 3.10.6)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。

[转]Java CAS 原理剖析

[转]Java CAS 原理剖析

在Java并发中,我们最初接触的应该就是synchronized关键字了,但是synchronized属于重量级锁,很多时候会引起性能问题,volatile也是个不错的选择,但是volatile不能保证原子性,只能在某些场合下使用。 像synchronized这种独占锁属于悲观锁,它是在假设一定会发生冲突的,那么加锁恰好有用,除此之外,还有乐观锁,乐观锁的含义就是假设没有发生冲突,那么我正好可以进行某项操作,如果要是发生冲突呢,那我就重试直到成功,乐观锁最常见的就是CAS。

volatile关键字解析

volatile关键字解析

volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。   volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volatile关键字的场景。   以下是本文的目录大纲:   一.内存模型的相关概念   二.并发编程中的三个概念   三.Java内存模型   四..深入剖析volatile关键字   五.使用volatile关键字的场景

CenterOS7安装java

CenterOS7安装java

CenterOS7安装java

CenterOS7安装java8

CenterOS7安装java8

CenterOS7安装java8

nginx部署vue项目

nginx部署vue项目

此文档主要介绍如何使用nginx部署vue等前端项目,并配置SSL证书部署的前提下是服务器已经安装nginx,前端项目已打包成静态文件

我在 GitHub 上的开源项目

我在 GitHub 上的开源项目

goods Java 🤩1  ⭐️2  🖖0 网络书城源码 2. note 🤩1  ⭐️0  🖖0 日常笔记 3. java-example Java 🤩1  ⭐️0  🖖0 java一些项目示例 4. design-patterns Java 🤩1  ⭐️0  🖖0 阅读书籍 《Head Frist 设计模式》练习代码 5. code-generate Java 🤩1  ⭐️0  🖖1 代码一键生成 6. miniapp JavaScript 🤩1  ⭐️0  🖖0 小程序 7. springboot-web Java 🤩1  ⭐️0  🖖0 springboot脚手架 8. cloud Java 🤩1  ⭐️0  ?….

[转]Java反射

[转]Java反射

Java 反射由浅入深 | 进阶必备 原文链接 本博文主要记录我学习 Java 反射(reflect)的一点心得,在了解反射之前,你应该先了解 Java 中的 Class 类,如果你不是很了解,可以先简单了解下。 一、Java 反射机制 参考了许多博文,总结了以下个人观点,若有不妥还望指正: Java 反射机制在程序运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种 动态的获取信息 以及 动态调用对象的方法 的功能称为 java 的反射机制。 反射机制很重要的一点就是“运行时”,其使得我们可以在程序运行时加载、探索以及使用编译期间完全未知的 .class 文件。换句话说,Java 程序可以加载一个运行时才得知名称的 .class 文件,然后获悉其完整构造,并生成其对象实体、或对其 fields(变量)设值、或调用其 methods(方法)。 不知道上面的理论你能否明白,反正刚接触反射时我一脸懵比,后来写了几个例子之后:哦~~原来是这个意思! 若暂时不明白理论没关系,先往下看例子,之后再回来看相信你就能明白了。 二、使用....

[转]OAuth2.0 原理流程及其单点登录和权限控制

[转]OAuth2.0 原理流程及其单点登录和权限控制

[转]OAuth2.0 原理流程及其单点登录和权限控制 原文链接 单点登录是多域名企业站点流行的登录方式。本文以现实生活场景辅助理解,力争彻底理清 OAuth2.0 实现单点登录的原理流程。同时总结了权限控制的实现方案,及其在微服务架构中的应用。 1 什么是单点登录 1.1 多点登录 传统的多点登录系统中,每个站点都实现了本站专用的帐号数据库和登录模块。各站点的登录状态相互不认可,各站点需要逐一手工登录。如下图,有两个术语含义如下: 认证(authentication): 验证用户的身份; 授权(authorization): 验证用户的访问权限。 1.2 单点登录 单点登录,英文是 Single Sign On,缩写为 SSO。 多个站点(192.168.1.20X)共用一台认证授权服务器(192.168.1.110,用户数据库和认证授权模块共用)。用户经由其中任何一个站点(比如 192.168.1.201)登录后,可以免登录访问其他所有站点。而且,各站点间可以通过该登录状态直接交互。 2 OAuth2 认证授权的原理流程 2.1 生活实例【★★重点★★】 为了直观的理解 O....

手写MyBatis

手写MyBatis

手写MyBatis 1. 前言 本篇博客,将使用JDK动态代理、注解、反射等技术,编写一个最简单的MyBatis,可基本实现对象的增删查改 2. 注解的定义 2.1 Delete注解 /** * @ClassName Delete * @Descriiption 删除注解 * @Author yanjiantao * @Date 2019/6/27 11:03 **/ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Delete { public String value(); } 2.2 Insert注解 /** * @ClassName Delete * @Descriiption 保存注解 * @Author yanjiantao * @Date 2019/6/27 11:03 **/ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Insert {....

OAuth2.0登录的四种方式

OAuth2.0登录的四种方式

OAuth登录的四种方式 1. 授权码 授权码(authorization code)方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌。 这种方式是最常用的流程,安全性也最高,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。 例如,有一个网站A(高德地图),需要向网站B(微博)授权登录 第一步,拿到授权码 A 网站(高德)提供一个链接,用户点击后就会跳转到 B(微博) 网站,授权用户数据给 A(高德) 网站使用。下面就是 A (高德)网站跳转 B (微博)网站的一个示意链接。 https://api.weibo.com/oauth2/authorize? client_id=884965267 &redirect_uri=https%3A%2F%2Fid.amap.com%2Findex%2Fweibo%3Fpassport%3D1 client_id客户端id,redirect_uri跳转链接 第二步,在用户跳转后,B 网站会要求用户登录,然后询问是否同意给....

git提交emoji指南

git提交emoji指南

emoji 指南 emoji emoji 代码 commit 说明 🎉 (庆祝) tada 初次提交 ✨ (火花) sparkles 引入新功能 🔖 (书签) bookmark 发行/版本标签 🐛 (bug) bug 修复 bug 🚑 (急救车) ambulance 重要补丁 🌐 (地球) globe_with_meridians 国际化与本地化 💄 (口红) lipstick 更新 UI 和样式文件 🎬 (场记板) clapper 更新演示/示例 🚨 (警车灯) rotating_light 移除 linter 警告 🔧 (扳手) wrench 修改配置文件 ➕ (加号) heavy_plus_sign 增加一个依赖 ➖ (减号) heavy_minus_sign 减少一个依赖 ⬆ (上升箭头) arrow_up 升级依赖 ⬇ (下降箭头) arrow_down 降级依赖 ⚡ (闪电)🐎 (赛马) zapracehorse 提升性能....

gson无法正常将时间戳转化成date

gson无法正常将时间戳转化成date

gson无法正常将时间戳转化成date gson将时间戳转化成date时,报错 Failed to parse date ["1551950239757']: Invalid time zone indicator '3'

记录精彩的程序人生