Lock下的ReentranLock对Lock类的实现主要依赖与sync,而sync继承了AbstactQueuedSynchronizer(AQS),它是JUC包下对同步实现的基础工具。AQS中定义了一个共享变量 volidate int state,当有线程获取这个变量失败后,就会进入同步队列中等待;如果获取成功,则执行临界代码,执行完后释放资源,并通知同步队列中的等待线程来获取资源。
AQS是一个抽象类,内置自旋锁ReentrantLock实现同步队列
Voliate是jdk中自带的轻量级线程操作可见方式,它包含三个特性:
可见性
每个线程都有自己独立的内存空间,也就是线程的工作内存,它对变量的操作都在自己的独立工作空间中进行,执行结束后再同步到主内存中去。在这期间段,必然有时间差,这个时间差内的操作对其他线程都是不可见的。volatile有’‘挥发’’,’‘不稳定、敏感’'的意思,当用volatile修饰变量的时候,线程就都会在主内存中修改变量。故此保证了可见性。
有序性(禁止指令重排)
如果一个线程要实例化一个对象,当这个线程释放了资源,如果在没有同步的情况下进行读操作,很可能得不到一个正确的对象。这是跟java虚拟机的编译有关。java虚拟机为了优化编译,初始化的执行顺序是未定义的。比如一个类的实例化顺序首先是检查当前类是否在元空间中是否存在,如果不存在,在双亲委派机制下依次查询当前类加载器、扩展类加载器、应用类加载器,如果查到了给该类分配内存,设置默认值,然后设置它的元信息(GC、Hash值、类元信息),最后初始化。但是编译器不一定会按照这个顺序来进行,很有可能是先分配内存,设置默认值,当其他线程来获取这个类的时候,这个类还没有加载完成,就导致无法获取到有效的值。当加了volatile,这样就会对它的读写操作进行指令重排,确定对象实例化值后才返回引用。
不保证原子性
数据在++的时候,其他的线程有足够的时间来修改当前的这个值,由于这个值在写操作的时候没有进行加锁的限制,所以volatile不能保证它的原子性。
文章浏览阅读3.4k次,点赞3次,收藏21次。很多朋友在看一部电影前都喜欢先找一下网友们对该片的评价。国内的电影评分网站,要数豆瓣最出名。接下来我们将爬取豆瓣至今TOP250的电影的详细信息。豆瓣有专门一个 TOP250 的电影链接 -> https://movie.douban.com/top250首先我们模拟浏览器发送请求,将数据保存为html网页格式,查看返回数据是否正常。import requestsfrom bs4 ...
文章浏览阅读1.1w次,点赞4次,收藏32次。IoT(即物联网)一词是指互联设备的集合网络,以及促进设备与云之间以及设备自身之间通信的技术。由于价格低廉的计算机芯片和高带宽电信的出现,我们现在已有数十亿台设备连接到互联网。也就是说,牙刷、吸尘器、汽车、机器等日常设备可以利用传感器收集数据,智能地为用户服务。 物联网将日常“事物”与互联网相结合。90 年代以来,计算机工程师一直在为日常用品添加传感器和处理器。但是,这项工作最初进展十分缓慢,因为芯片又大又笨重。名为 RFID 标签的低功耗计算机芯片是首个用于跟踪昂贵设备的芯片。随着计算设备尺寸不断缩小,_iot
文章浏览阅读1.4w次,点赞11次,收藏55次。0.前言开发过程中遇到js线程和ui渲染线程互斥问题。导致ui无法正常更新等问题。这些问题的根源就是因为浏览器的多线程和js的单线程引起的。看本篇博客之前,应该充分理解消息队列,事件循环,同步异步任务等概念。 这些概念以前都知道,也了解多线程的概念。但是当遇到问题的时候,这些东西都被抛到脑后,值得深思。1.知识点补充js单线程js运作在浏览器中,是单线程的,js代码始终在一个线程上执行,此线程被称_浏览器点击事件是单线程吗
文章浏览阅读833次,点赞22次,收藏15次。N皇后,数独
文章浏览阅读261次。Alcohol 120%刻录教程 【虎.无名】由于非正版的Nero可能刻出废盘,所以我改用“Alcohol 120%”了,它不但可用来虚拟光驱,刻录功能似乎也不弱。参考:Nero刻出废盘的秘密(待考证)[url]http://zeroliu.blogdriver.com/zeroliu/..._利用alcohol 120%制作音乐cd
文章浏览阅读8.4k次,点赞6次,收藏27次。神奇的模型在哪儿?谁才是最适合我的模型?村口大黄狗为何连夜嚎叫?……_sd模型网站
文章浏览阅读176次。php数组转为url参数的实现方法:首先创建一个PHP示例文件;然后定义一个数组;最后通过“http_build_query( $array )”方法将数组转为URL参数即可。php 将数组转换网址URL参数$array =array ( 'id' =123, 'name' = 'dopost' );echo http_build_query( $array );//得到结果id=123name=..._php 数组转reqeust
文章浏览阅读4.3k次。nslookup是一个网络工具,通常用于查询域名系统(DNS)服务器以获取主机名或IP地址相关的信息。它可以用于查找主机名的IP地址,反向查找IP地址的主机名,以及查询DNS记录的其他信息。_nslookup命令的作用和使用方法
文章浏览阅读1.1k次。2019独角兽企业重金招聘Python工程师标准>>> ..._n n ___': - _* . &; v. 7_ 'v & .
文章浏览阅读138次。掌握了小小的像素,我们可以使用更加复杂一点的东西了,对,就是图像,无数的像素的集合~还记得上次我们为了生成的一张图片,花了无数时间,还好一般游戏不会在游戏的过程中动态生成图像,都是将画好的作为资源封装到游戏中。对2D游戏,图像可能就是一些背景、角色等,而3D游戏则往往是大量的贴图。虽然是基础,这里还是要罗嗦一下,之前说的RBG图像,在游戏中我们往往使用RGBA图像,这个A是alpha,也就是表示透..._pygame 中 screen.set_clip
文章浏览阅读1.6k次。笔记_tcp/ip包内容
文章浏览阅读1.4k次。静态网站:在tomcat的webapps目录下创建一个目录(命名必须不包含中文和空格),这个目录称之为项目目录在项目目录下创建一个html文件动态网站:在tomcat的webapps目录下创建一个项目目录在项目目录下创建如下内容WEB-INF目录在WEB-INF目录下创建web.xml文件创建静态或动态页面http协议:无状态协议,仅连接一次(ftp_创建一个savelogin.java文件,该页面作用