CAS

Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS

China☆狼群 提交于 2020-08-20 09:19:40
首先介绍一些乐观锁与悲观锁:   悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如 Java里面的同步原语 synchronized关键字的实现也是悲观锁 。   乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁, 但是在更新的时候会判断一下在此期间别人有没有去更新这个数据 ,可以使用版本号等机制。 乐观锁适用于多读的应用类型 ,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在 Java中java.util.concurrent.atomic包下面的 原子变量类就是使用了乐观锁的一种实现方式CAS实现的 。 乐观锁的一种实现方式-CAS(Compare and Swap 比较并交换):   锁存在的问题:      Java在JDK1.5之前都是靠 synchronized关键字保证同步的 ,这种通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程持有共享变量的锁,都采用独占的方式来访问这些变量。这就是一种独占锁,独占锁其实就是一种悲观锁,所以可以说 synchronized 是悲观锁。  

Map

怎甘沉沦 提交于 2020-08-20 08:47:32
HashMap(局部变量使用) 线程不安全的,没有加锁 Collections.synchronizedMap 线程安全的,是一个加锁版本的HashMap,Map<String, String> m = Collections.synchronizedMap(new HashMap<>()); Hashtable 是线程安全的,方法都添加synchronized ConcurrentHashMap(多线程高并发推荐使用) 线程安全的,内部使用(compareAndSwapInt)CAS进行插入,使用CAS保证线程安全 ConcurrentSkipListMap(多线程高并发有序的集合) 插入时也是使用compareAndSwapObject(CAS)保证线程安全的;查找使用跳表,所以效率很高; ConcurrentSkipListMap<String,String> skip = new ConcurrentSkipListMap<>(); 来源: oschina 链接: https://my.oschina.net/u/3141521/blog/4468851

Exchange 2007 证书过期问题

ⅰ亾dé卋堺 提交于 2020-08-20 07:42:14
症状:域环境中,安装了Exchange 2007,未搭建证书服务器,使用Outlook登录后出现提示Exchange服务器证书过期。同时服务器端日志会有事件ID:12014、12015的警告和错误提示 解决:由于没有安装企业CA,Exchange 2007使用了自签名证书,期限一般为一年,过期后会有该提示。 进入“Exchange 命令行管理程序”,依此输入以下命令: Get-ExchangeCertificate -DomainName CAS01.contoso.com 注:CAS01.contoso.com为Exchange服务器计算机名。得到一个证书指纹 Get-ExchangeCertificate -Thumbprint c4248cd7065c87cb942d60f7293feb7d533a4afc | New-ExchangeCertificate 注:c4248cd7065c87cb942d60f7293feb7d533a4afc为第一个命令得到的证书指纹。运行命令后会提示使用一个新证书覆盖现有证书,根据提示输入Y确认。 Enable-ExchangeCertificate -Thumbprint 5113ae0233a72fccb75b1d0198628675333d010e -Services POP,IMAP,SMTP,IIS 注

并发编程AQS----共享锁

蹲街弑〆低调 提交于 2020-08-20 06:18:27
Semaphore Semaphore 字面意思是信号量的意思,它的作用是控制访问特定资源的线程数目。应用场景:资源访问,服务限流。 Semaphore 实现AbstractQueuedSynchronizer的方法与 ReentrantLock 一样 Semaphore构造方法 public Semaphore( int permits) {------permits 表示能同时有多少个线程访问我们的资源 sync = new NonfairSync(permits); -------------默认创建的是非公平锁。 } abstract static class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 1192457210091910933L; Sync(int permits) { setState(permits);-------传入的permits做i为了state的值,作为资源总数 } semaphore.acquire();获取资源,源码实现 public void acquire() throws InterruptedException { sync.acquireSharedInterruptibly( 1 );--------

【交叉/综合/新兴】 2019年-中国计算机学会推荐国际学术会议和期刊目录(十)

橙三吉。 提交于 2020-08-20 02:10:29
1.中国计算机学会推荐国际【 学术期刊 】 交叉/综合/新兴 (1)A类 序号 刊物简称 刊物全称 出版社 网址 1 JACM Journal of the ACM ACM http://dblp.uni-trier.de/db/journals/jacm/ 2 Proc. IEEE Proceedings of the IEEE IEEE http://dblp.uni-trier.de/db/journals/pieee/ (2)B类 序号 刊物简称 刊物全称 出版社 网址 1 Bioinformatics Oxford University Press http://dblp.uni-trier.de/db/journals/bioinformatics/ 2 Briefings in Bioinformatics Oxford University Press http://dblp.uni-trier.de/db/journals/bib/ 3 Cognition Cognition:International Journal of Cognitive Science Elsevier http://www.journals.elsevier.com/cognition/ 4 TASAE IEEE Transactions on Automation Science

99 道 Java 多线程面试题,看完我跪了!

老子叫甜甜 提交于 2020-08-19 23:56:45
今天给大家更新的是一篇关于多线程面试的文章,是根据时下热门的面试内容给大家进行总结的,如有雷同,请多见谅。 本篇文章属于干货内容!请各位读者朋友一定要坚持读到最后,完整阅读本文后相信你对多线程会有不一样感悟,下次面试和面试官也能杠一杠相关内容了。 1.什么是进程? 进程是系统中正在运行的一个程序,程序一旦运行就是进程。 进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等。 2.什么是线程? 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 3.线程的实现方式? 1.继承Thread类 2.实现Runnable接口 3.使用Callable和Future 4.Thread 类中的start() 和 run() 方法有什么区别? 1.start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。然后通过此Thread类调用方法run(

新鲜出炉!面试90%会被问到的Java多线程面试题,史上最全系列!

大城市里の小女人 提交于 2020-08-19 21:59:52
前言 最近很多粉丝朋友私聊我说能不能给整理出一份多线程面试题出来,说自己在最近的面试中老是被问到这一块的问题被问的很烦躁,前一段时间比较忙没时间回私信,前两天看到私信我也是赶紧花了两天给大家整理出这一块的面试题库出来让大家看看,话不多说都给大家总结在下面了! 1、多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓知其然知其所以然,会用只是知其然,为什么用才是知其所以然,只有达到知其然知其所以然的程度才可以说是把一个知识点运用自如。OK,下面说说我对这个问题的看法: (1)发挥多核CPU的优势 随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4 核、8 核甚至 16 核的也都不少见,如果是单线程的程序,那么在双核 CPU 上就浪费了 50%,在 4 核 CPU 上就浪费了 75%。单核 CPU 上所谓的多线程那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程同时运行罢了。多核 CPU 上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核 CPU 的优势来,达到充分利用 CPU 的目的。 (2)防止阻塞 从程序运行效率的角度来看,单核 CPU 不但不会发挥出多线程的优势,反而会因为在单核 CPU

.NET Core微服务之基于Ocelot实现API网关服务(续)

偶尔善良 提交于 2020-08-19 20:48:58
Tip: 此篇已加入 .NET Core微服务基础系列文章索引 一、负载均衡与请求缓存 1.1 负载均衡   为了验证负载均衡,这里我们配置了两个Consul Client节点,其中ClientService分别部署于这两个节点内(192.168.80.70与192.168.80.71)。   为了更好的展示API Repsonse来自哪个节点,我们更改一下返回值: [Route( " api/[controller] " )] public class ValuesController : Controller { // GET api/values [HttpGet] public IEnumerable< string > Get() { return new string [] { $ " ClinetService: {DateTime.Now.ToString()} {Environment.MachineName} " + $ " OS: {Environment.OSVersion.VersionString} " }; } ...... }   Ocelot的配置文件中确保有负载均衡的设置: { " ReRoutes " : [ ...... " LoadBalancerOptions " : { " Type " : " RoundRobin " }, ....

《麻省理工科技评论》2020年度全球科技创新英雄榜发布,5位华人上榜

允我心安 提交于 2020-08-19 16:58:13
     美国东部时间 6 月 17 日,《麻省理工科技评论》公布了第 20 届 Innovators Under 35 评选结果,即 2020 年度 全球 “ 35 岁以下科技创新 35 人 ”榜单。   在此次的 35 名上榜者中, 共有 5 位华人 ,他们分别是香侬科技创始人兼 CEO 李纪为 、芝加哥大学分子工程学院助理教授 王思泓 、伊利诺伊大学厄巴纳-香槟分校机械科学与工程系助理教授 蔡丽丽 、伊利诺伊大学厄巴纳-香槟分校计算机科学系助理教授 李博 ,以及 Modern Electron 联合创始人兼 CEO 潘世昂 。   在当下这个略显混乱的时代,看到如此多的青年才俊仍在努力让世界变得更加美好,着实令人内心充满勇气。   这对于那些抗击病毒大流行的医务人员和为社会正义而战的普通公民而言,以及对那些致力于通过技术来解决这些问题和许多其他问题的人们来说,都是真真切切的精神鼓舞。   榜单中的 35 位年轻创新者并不都在努力抗击新冠病毒大流行,也并非都在寻求社会不公的补救策略。尽管他们没有具体解决这些问题,但却都在努力寻求用科技帮助世人的最新方法。他们试图解决我们的气候危机,找到帕金森氏症的治疗方法,亦或是为那些迫切需要的人提供饮用水。   这份榜单的评选每年都会产生 500 多个提名,编辑们的首要任务是筛选出 100 名入围候选人,提交给 25 位评委专家

精美图文讲解Java AQS 共享式获取同步状态以及Semaphore的应用

巧了我就是萌 提交于 2020-08-19 04:13:48
| 好看请赞,养成习惯 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough 现陆续将Demo代码和技术文章整理在一起 Github实践精选 ,方便大家阅读查看,本文同样收录在此,觉得不错,还请Star🌟 看到本期内容这么少,是不是心动了呢? 前言 上一篇万字长文 Java AQS队列同步器以及ReentrantLock的应用 为我们读 JUC 源码以及其设计思想做了足够多的铺垫,接下来的内容我将重点说明差异化,如果有些童鞋不是能很好的理解文中的一些内容,强烈建议回看上一篇文章,搞懂基础内容,接下来的阅读真会轻松加愉快 AQS 中我们介绍了独占式获取同步状态的多种情形: 独占式获取锁 可响应中断的独占式获取锁 有超时限制的独占式获取锁 AQS 提供的模版方法里面还差共享式获取同步状态没有介绍,所以我们今天来揭开这个看似神秘的面纱 AQS 中的共享式获取同步状态 独占式是你中没我,我中没你的的一种互斥形式,共享式显然就不是这样了,所以他们的唯一区别就是: 同一时刻能否有多个线程同时获取到同步状态 简单来说,就是这样滴: 我们知道同步状态 state 是维护在 AQS 中的,抛开可重入锁的概念,我在上篇文章中也提到了