rh

【JUC】JDK1.8源码分析之ReentrantReadWriteLock

喜欢而已 提交于 2020-01-25 22:14:52
重入锁 ReentrantLock是排他锁 ,排他锁在同一时刻仅有一个线程可以进行访问,但是在大多数场景下,大部分时间都是提供读服务,而写服务占有的时间较少。然而读服务不存在数据竞争问题,如果 一个线程在读时禁止其他线程读势必会导致性能降低 。所以就提供了读写锁。 读写锁维护着一对锁,一个读锁和一个写锁,读锁是共享锁,写锁是独占锁 。通过分离读锁和写锁,使得 并发性比一般的排他锁有了较大的提升 :在同一时间可以允许多个读线程同时访问,但是在写线程访问时,所有读线程和写线程都会被阻塞。 读写锁的主要特性: 公平性:支持公平性和非公平性。 重入性:支持重入。读写锁最多支持65535个递归写入锁和65535个递归读取锁。 锁降级:遵循获取写锁、获取读锁在释放写锁的次序,写锁能够降级成为读锁 读写锁ReentrantReadWriteLock实现接口ReadWriteLock,该接口维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的。 public interface ReadWriteLock { Lock readLock(); Lock writeLock(); } ReadWriteLock定义了两个方法。readLock()返回用于读操作的锁,writeLock()返回用于写操作的锁

ReentrantReadWriteLock源码分析

喜你入骨 提交于 2020-01-17 18:23:25
概述 ReentrantReadWriteLock维护了一对相关的锁,它们分别是共享readLock和独占writeLock。关于共享读锁和排他写锁的概念其实很好理解。所谓共享读锁就是一个线程读的时候,其它线程也可以来读(共享),但是不能来写。排他写锁是指一个线程在写的时候,其它线程不能来写或读(排他)。除了这个特点之外,ReentrantReadWriteLock还有一个特点就是可重入的。它和ReentrantLock一样都是支持Condition的。而且ReentrantReadWerite还支持锁降级,即允许将写锁降级为读锁。 简单使用 最最基础的用法如下: ReentrantReadWriteLock lock=new ReentrantReadWriteLock(); public void read(){ lock.readLock().lock(); //需要加读锁的操作 lock.readLock().unlock(); } public void write(){ lock.writeLock().lock(); //需要加写锁的操作 lock.writeLock().unlock(); } ReentrantReadWriteLock无非就是这几种情况,读读共享,写写互斥,读写互斥,写读互斥。 下面我们就以这个最基础的用法,来分析一下其内部的原理 源码分析

centos7开放端口

徘徊边缘 提交于 2020-01-09 12:25:50
查询有哪些端口是开启的: [ root@centos7 ~ ] # firewall-cmd --list-port 开启端口 [ root@centos7 ~ ] # firewall-cmd --zone=public --add-port=80/tcp --permanent 重启防火墙: [ root@centos7 ~ ] # firewall-cmd --reload 查询端口号80 是否开启: [ root@centos7 ~ ] # firewall-cmd --query-port=80/tcp 命令含义: –zone #作用域 –add-port=80/tcp #添加端口,格式为:端口/通讯协议 –permanent #永久生效,没有此参数重启后失效 关闭firewall: systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service #禁止firewall开机启动 二、CentOS6防火墙开放端口: 在我们使用CentOS系统的时候,CentOS防火墙有时是需要改变设置的。CentOS防火墙默认是打开的,设置CentOS防火墙开放端口方法如下: 打开iptables的配置文件:vi /etc/sysconfig/iptables 修改CentOS防火墙时注意

Java并发编程--ReentrantReadWriteLock

戏子无情 提交于 2020-01-05 18:52:59
概述   ReentrantReadWriteLock是Lock的另一种实现方式,我们已经知道了ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWriteLock允许多个读线程同时访问,但不允许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提高了并发性。在实际应用中,大部分情况下对共享数据(如缓存)的访问都是读操作远多于写操作,这时ReentrantReadWriteLock能够提供比排他锁更好的并发性和吞吐量。   读写锁内部维护了两个锁,一个用于读操作,一个用于写操作。所有 ReadWriteLock实现都必须保证 writeLock操作的内存同步效果也要保持与相关 readLock的联系。也就是说,成功获取读锁的线程会看到写入锁之前版本所做的所有更新。   ReentrantReadWriteLock支持以下功能:     1)支持公平和非公平的获取锁的方式;     2)支持可重入。读线程在获取了读锁后还可以获取读锁;写线程在获取了写锁之后既可以再次获取写锁又可以获取读锁;     3)还允许从写入锁降级为读取锁,其实现方式是:先获取写入锁,然后获取读取锁,最后释放写入锁。但是,从读取锁升级到写入锁是不允许的;     4)读取锁和写入锁都支持锁获取期间的中断;     5)Condition支持。仅写入锁提供了一个

59. Spiral Matrix && Spiral Matrix II

南楼画角 提交于 2019-12-28 02:00:55
Spiral Matrix Given a matrix of m x n elements ( m rows, n columns), return all elements of the matrix in spiral order. For example, Given the following matrix: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] You should return [1,2,3,6,9,8,7,4,5] . 思路: 可参考 剑指offer :题20 class Solution { public: vector<int> spiralOrder(vector<vector<int> > &matrix) { vector<int> vec; if(!matrix.size() || !matrix[0].size()) return vec; int row = matrix.size(), col = matrix[0].size(); int rl = 0, rh = row-1, cl = 0, ch = col-1; while(rh >= rl && ch >= cl) { for(int c = cl; c <= ch; ++c) vec.push_back(matrix[rl][c]); if(

AVL树的删除

冷暖自知 提交于 2019-12-21 02:35:23
本文默认不讲左右旋转和左右结点失衡,总共六种情况的处理 先是AVL树的定义 typedef struct BSTNode { ElemType data; int bf; struct BSTNode* lchild, * rchild; }BSTNode, *BSTree; 然后是左右旋转 void R_Rotate(BSTree& p) { BSTree lc = p->lchild; p->lchild = lc->rchild; lc->rchild = p; p = lc; } void L_Rotate(BSTree& p) { BSTree rc = p->rchild; p->rchild = rc->lchild; rc->lchild = p; p = rc; } 然后是对左结点和右结点做平衡 void LeftBalance(BSTree& T) { BSTree lc = T->lchild; switch (lc->bf) { case EH: { T->bf = LH; lc->bf = RH; R_Rotate(T); break; } case LH: { T->bf = lc->bf = EH; R_Rotate(T); break; } case RH: { BSTree rd = lc->rchild; switch (rd->bf) {

ReentrantReadWriteLock

跟風遠走 提交于 2019-12-11 01:22:10
ReentrantReadWriteLock, 可重入读写锁, 包含读锁与写锁,具体结构如下图: ReentrantReadWriteLock包含了很多内部类,其中最核心的为Sync、ReadLock、WriteLock Sync内部类 sync内部类是AQS的实现类,实现了共享锁、独占锁的获取与释放方法,同时将AQS中的state状态值拆分为高16位、低16位(分别代表读锁(共享锁)获取数量、写锁(独占锁)获取数量) /** int 类型state变量拆分为高16位,,代表共享模式; 低16位,代表独占模式**/static final int SHARED_SHIFT = 16; static final int SHARED_UNIT = (1 << SHARED_SHIFT); static final int MAX_COUNT = (1 << SHARED_SHIFT) - 1; static final int EXCLUSIVE_MASK = (1 << SHARED_SHIFT) - 1; /** 返回共享锁的获取次数(包含重入), 左移16位,低于16位返回0 */ static int sharedCount(int c) { return c >>> SHARED_SHIFT; } /** 返回独占锁的重入次数(独占不重入就为1),c直接执行与操作

Error while loading shared libraries: libpq.so.5: cannot open shared object file: No such file or directory

匿名 (未验证) 提交于 2019-12-03 02:56:01
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试): 问题: I am trying to execute pg_dump on PostgreSQL 9.0.4 server running on Debian and I am getting the error below: ./pg_dump: error while loading shared libraries: libpq.so.5: cannot open shared object file: No such file or directory libpq.so.5 is a link to libpq.so.5.3 as shown below lrwxrwxrwx 1 root root 12 Jun 27 16:24 libpq.so.5 -> libpq.so.5.3 -rwxr-xr-x 1 root root 180749 Jun 21 02:43 libpq.so.5.3 What is it that I am doing wrong? 回答1: Try this: 1: Know the path of libpq.so.5 find / -name libpq.so.5 Output example: /usr/pgsql-9.4/lib/libpq

Android - Gaussian blur like effect - OpenGL

匿名 (未验证) 提交于 2019-12-03 01:45:01
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试): 问题: Where not specified this question is just building on top of the CameraCaptureActivity within the grafika project found on github. It has a built in blur effect that utilises a 3x3 kernel kernel = new float[] { 1f/16f, 2f/16f, 1f/16f, 2f/16f, 4f/16f, 2f/16f, 1f/16f, 2f/16f, 1f/16f }; However this blur effect is not strong enough, im looking for something like what the gaussian effect can do on iOS with UIVisualEffectView , it looks something like this: A nice smooth heavy blur effect but so far the best ive managed is this: As you can see it

ovirt4.2开发环境搭建

匿名 (未验证) 提交于 2019-12-03 00:25:02
开发环境搭建 1. 安装4.2的源 # yum install http://resources.ovirt.org/pub/yum-repo/ovirt-release42.rpm 2. 安装第三方依赖 # yum install git java-devel maven openssl \ # yum install ovirt-engine-wildfly ovirt-engine-wildfly-overlay # yum install ovirt-host-deploy ovirt-setup-lib 3. 安装ovirt-engine # yum install ovirt-engine* 4. 配置java # alternatives --config java # alternatives --config javac 5. 设置环境变量 设置环境变量(具体的值根据你系统安装的来设置) source /etc/profile 6. 设置hostname 7. 配置数据库 === PostgreSQL accessibility Configure PostgreSQL to accept user and password: Locate `pg_hba.conf` within your distribution, common locations are: