Amp

阅读java.util.concurrent.SynchronousQueue源码Note

天涯浪子 提交于 2020-10-06 06:16:02
java.util.concurrent.SynchronousQueue 同步队列,主要用去生产与消费! 采用CAS方式来实现并发控制, sun.misc.Unsafe 基于公平性做了两种实现,一公平策略,使用队列实现;二非公平策略,使用栈实现。 常用操作 操作 put 一直阻塞,直至数据被消费 offer 分为两种,一种不阻塞,尝试阿静数据放入队列,无空间时,则直接返回false;一种指定阻塞时间,超时后仍无空间,返回false,否则返回true take 一直阻塞,直至获取到数据 poll 分为两种,一种不阻塞,尝试从队列中获取数据,未获取到返回null;另一种指定阻塞时间,超时后仍未获取到数据,返回null 底层实现 两种策略的实现,底层均是使用了 java.util.concurrent.SynchronousQueue.Transferer , 此抽象类定义了如何放入数据和从队列中取数据,相当于是传输数据,方法名称也很贴切: transfer . 1.1 首先来看非公平策略的实现,此策略使用栈实现, java.util.concurrent.SynchronousQueue.TransferStack ,栈中定义了栈顶节点head,类型为 java.util.concurrent.SynchronousQueue.TransferStack.SNode , 1.2

618来袭,视频H5引领带货潮流

橙三吉。 提交于 2020-10-06 00:48:04
作为疫情后的首个大型购物节,618年中大促近在眼前,各大品牌主们早就严阵以待、各备奇招,而高效的媒介投放当然必不可少。小编浏览了大量品牌营销H5后发现,无论是线上产品特卖还是线下活动引流,很多作品都是视频类型的。而对于此类H5,咱们意派Epub360的用户一定不陌生。 意派Epub360支持上传腾讯视频及本地视频,咱们早前也推送过相关实用贴,如: 《关于视频H5,这里有份超实用的小技巧!!!》 、 《视频H5制作过程中常见的四个坑及解决措施》 。还没看过的小伙伴可以学习一下哦~ 下面,咱们就一起来看看各类优质的视频类品牌营销H5案例吧(文末还有电商模板奉上哦),希望广大用户可以从中获得灵感并帮助品牌主们成为618大赢家! 案例 《快来围观史上最惨市场部》 出品方: 三人游 创意设计 品牌方: 京东叮咚 实现方式: 意派Epub360 H5页面制作工具 创意特色: 动画视频、手绘插画、网页跳转 内容特色: 该视频类H5明为展现京东叮咚市场部员工从天堂到地狱的悲惨心路历程,实际上则是为了突出“京东叮咚mini2直线降价,618总补贴6.18亿”这一核心信息。作品播放顺畅且趣味性强,易引起用户好感。 《全球锦鲤神秘失踪》 品牌方: 掌上生活 创意特色: 动画视频、手绘插画、网页跳转 内容特色: 该视频类H5旨在宣传掌上生活锦鲤节,视频主要包含两部分内容

android 系统核心机制binder(09)binder java层实现

泄露秘密 提交于 2020-10-06 00:37:49
本章关键点总结 & 说明: 这里关注➕ Binder Java实现部分,主要谈了 java实现框架和demo,最后分析了 关键类 Binder、JavaBBinderHolder、JavaBBinder以及他们之间的关系。 1 binder java层的整体框架 1.1 整体框架图说明 Binder机制在C++层已经有了完整的实现。因此Java层完全不用重复实现,而是通过JNI衔接了C++层以复用其实现。因此java层的架构相对比较简单。如下所示: 同时这里用另一个图来说明下binder java层、 JNI的衔接以及binder C++层,如下所示: 1.2 binder相关类解读 类 名称 类 说明 IBinder Java层,提供了使用transact方法来调用远程服务的机制,以及DeathRecepient接口 Binder 实现IBinder接口,封装JNI实现,Java层Binder服务基类,BnXXX代表 BinderProxy 实现IBinder接口,封装JNI实现。提供transact方法调用远程服务,BpXXX代表 JavaBBinderHolder 内部存储了JavaBBinder JavaBBinder 将C++端的onTransact调用传递到Java端 BinderInternal 仅供Binder框架使用的类,内部有一个GcWatcher类

一个骚命令防止你的文件被误删除!

醉酒当歌 提交于 2020-10-05 13:52:27
大家好,我是良许。 文件是我们在电脑里最珍贵的财富,我们经常工作了老半天,然后出来的成果就只是一个文件而已。特别是程序员,我们写了半天的代码,结果也就是一个个代码文件而已。 但是,我们都有过这样惨痛的经历——工作了老半天,结果不小心把文件删除了…… 这时候,你的心情是怎样的?痛苦?自责?无奈? 今天良许就给大家介绍一个命令,它将给你的重要文件加一把锁,防止误删除或误修改,为你的宝贝文件保驾护航! chattr命令简介 这里我们需要使用到一个命令是: chattr ,这个命令在大部分的 Linux 发行版里都有,所以对于它的安装就不赘述了。它的基本用法如下: $ chattr 操作符 属性 文件名 对于操作符,有以下三种: + :给文件增加属性 - :去除文件属性 = :设置文件的仅有属性 注意,这里讲的属性不是文件对应的系统属性,而是 chattr 给文件赋予的属性。本文要讲的属性有以下两个: a - 允许给文件追加内容 i - 保护模式(不允许删除或修改) 但是,它的属性可以设置很多,有兴趣的小伙伴可以去看下它的 man 手册。 $ man chattr 防止文件被误删除或修改 假如我们现在有个国宝级重要文件 file.txt ,现在我们使用 chattr 对它进行保护。在这里,我们给文件增加 +i 属性: $ sudo chattr +i file.txt 然后,我们可以使用

【MTK】Run-time Switchable Configuration机制

岁酱吖の 提交于 2020-10-05 00:28:49
1. 概述: 从Android P开始,Mediatek Release的 Project会出现一种叫做 RSC (Run-time Switchable Configuration )的 makefile 文件。 比如 RuntimeSwitchConfig.mk,RuntimeSwitch.mk 以及 OpxxBase.mk, DsdsBase.mk等等。 * 以下描述都以 Android Q 的Split Build Project为例 首先要说,这些 Makefile里的配置一旦被使用,通常其 优先级就是最高 的,会覆盖掉device.mk以及其他makefile里的设置。 具体用法还是要以各个Feature给客户提供的Customization方式的文档为准,这里只是概要的介绍RSC makefile以及机制在整个系统中的位置&作用,并不涉及具体的Feature的配置方法。 Mediatek 的Feature也并非全都支持Run-time Switch,具体配置方法,以各个Feature提供的 Customization为准. 目前粗略分类,会遇到三种情况: 第一类客户, 没有共版本需求 ,此时您可以选择忽略这些Makefile,我们的软件包虽然Release了这些各个package的 makefile,但其实默认并不会启用,您可以完全按照原有的 feature

ConcurrentHashMap原理分析和总结(JDK1.8)

有些话、适合烂在心里 提交于 2020-10-04 22:50:08
HashMap的线程安全版本,可以用来替换HashTable。在hash碰撞过多的情况下会将链表转化成红黑树。1.8版本的ConcurrentHashMap的实现与1.7版本有很大的差别,放弃了段锁的概念,借鉴了HashMap的数据结构:数组+链表+红黑树。ConcurrentHashMap不接受nullkey和nullvalue。 数据结构: 数组+链表+红黑树 并发原理: cas乐观锁+synchronized锁 加锁对象: 数组每个位置的头节点 方法分析: put方法: 先根据key的hash值定位桶位置,然后cas操作获取该位置头节点,接着使用synchronized锁锁住头节点,遍历该位置的链表或者红黑树进行插入操作。 稍微具体一点: 1.根据key的hash值定位到桶位置 2.判断if(table==null),先初始化table。 3.判断if(table[i]==null),cas添加元素。成功则跳出循环,失败则进入下一轮for循环。 4.判断是否有其他线程在扩容table,有则帮忙扩容,扩容完成再添加元素。进入真正的put步骤 5.真正的put步骤。桶的位置不为空,遍历该桶的链表或者红黑树,若key已存在,则覆盖;不存在则将key插入到链表或红黑树的尾部。 并发问题:假如put操作时正好有别的线程正在对table数组(map)扩容怎么办? 答:暂停put操作

七大常用的排序算法——堆排序实现

我怕爱的太早我们不能终老 提交于 2020-10-04 14:27:15
堆排序: 堆排序就是按照 大顶堆,小顶堆 的方式来进行排序,循环判断二叉树,每次循环判断得到一个值在二叉树顶端,然后依次与二叉树的最后一个值进行替换,每次替换二叉树的长度减一。 依次进行循环判断得到值然后顶端和末尾替换,从而实现了有序的排序。 思路: 1、将无序序列构成一个堆,根据需求创建成 大顶堆 或者 小顶堆 2、实现二叉树的堆顶元素和末尾元素的交换,将元素‘’沉‘到数组末端 3、重新调整结构,使其满足堆定义,然后继续交换堆顶元素和末尾元素,反复执行调整+交换,直到整个序列有序 测试代码: package BinaryTree; import java.util.Arrays; public class HeadSortDemo { public static void main(String[] args) { // TODO Auto-generated method stub int [] arr = {3,7,1,9,2}; System.out.println("堆排序前的数组 = " + Arrays.toString(arr)); headsort(arr); //调用堆排序方法 System.out.println("堆排序后的数组 = " + Arrays.toString(arr)); } public static void headsort(int []

JS深拷贝

旧巷老猫 提交于 2020-10-04 09:48:53
let arr1 = [1, 2, 3, 4, { name: 'hh' }] /浅克隆****/ // 1,展开运算符 let arr2 = [...arr1] // 2.splice let arr3 = arr1.splice(0) /深克隆****/ // 1.基于JSON方法,先把原始对象转换为字符串,再把字符串重新定义为对象。此时实现了内存的深度拷贝、 // 缺点:如果对象中的某一项是正则或者函数,基于JSON.parse 和 JSON.stringify处理后,就不再是正则(变为空对象)或者函数了(null) let arr4 = JSON.parse(JSON.stringify(arr1)) /** function _type(value) { return Object.prototype.toString.call(value) } function _deepClone(obj) { if (obj === null) return null if (typeof obj !== 'object') return obj // 如果是正则 if (_type(obj) === '[object RegExp]') return new RegExp(obj) // 如果是日期 if (_type(obj) === '[object Date]')

堆排序

此生再无相见时 提交于 2020-10-04 07:28:34
1、堆排序   堆排序是利用 堆 这种数据结构而设计的一种排序算法,堆排序是一种 选择排序, 它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。 2、 堆    堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图: 同时,我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子 该数组从逻辑上讲就是一个堆结构,我们用简单的公式来描述一下堆的定义就是: 大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] 小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2] 3、堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了 直接上代码: //方法入口 public static int [] heapSort ( int [] arr) { //构建大顶堆 for ( int i = arr. length / 2 - 1 ; i >= 0 ; i--) { //具体实现

Java 注解

允我心安 提交于 2020-10-04 06:21:23
元信息 Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。 Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。 由于jdk和框架大量使用注解,我也简单介绍下注解为何物,若您发现文章中存在错误或不足的地方,希望您能指出! Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。 作用在代码的注解是 @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。 @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。 @SuppressWarnings - 指示编译器去忽略注解中声明的警告。 作用在其他注解的注解(或者说 元注解 )是: @Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。 @Documented - 标记这些注解是否包含在用户文档中。 @Target - 标记这个注解应该是哪种 Java