CAS

Redis的事务功能详解

﹥>﹥吖頭↗ 提交于 2020-08-14 16:25:38
Redis的事务功能详解 MULTI、EXEC、DISCARD和WATCH命令是Redis事务功能的基础。Redis事务允许在一次单独的步骤中执行一组命令,并且可以保证如下两个重要事项: >Redis会将一个事务中的所有命令序列化,然后按顺序执行。Redis不可能在一个Redis事务的执行过程中插入执行另一个客户端发出的请求。这样便能保证Redis将这些命令作为一个单独的隔离操作执行。 > 在一个Redis事务中,Redis要么执行其中的所有命令,要么什么都不执行。因此,Redis事务能够保证原子性。EXEC命令会触发执行事务中的所有命令。因此,当某个客户端正在执行一次事务时,如果它在调用MULTI命令之前就从Redis服务端断开连接,那么就不会执行事务中的任何操作;相反,如果它在调用EXEC命令之后才从Redis服务端断开连接,那么就会执行事务中的所有操作。当Redis使用只增文件(AOF:Append-only File)时,Redis能够确保使用一个单独的write(2)系统调用,这样便能将事务写入磁盘。然而,如果Redis服务器宕机,或者系统管理员以某种方式停止Redis服务进程的运行,那么Redis很有可能只执行了事务中的一部分操作。Redis将会在重新启动时检查上述状态,然后退出运行,并且输出报错信息。使用redis-check-aof工具可以修复上述的只增文件

PPAP的五个阶段详解

白昼怎懂夜的黑 提交于 2020-08-14 14:42:57
一. 总则 针对如下情况,供应商必须获得顾客产品批准部门的完全批准。 1.新零件或产品(以前从未提供给顾客的特殊零件、材料或颜色)。 2.对以前提交零件的不符合之处进行了纠正。 3.由于设计记录、技术规范或材料方面的工程更改所引起的产品更改。 4.第I.3节要求的任何一种情况。 二. PPAP的过程要求 生产件:用于PPAP的产品必须取自有效的生产过程。所谓有效的生产过程是指 • 1小时至8小时的生产,且至少为300件连续生产的部件,除非顾客授权的质量代表另有规定。 • 使用与生产环境同样的工装、量具、过程、材料和操作工进行生产。 • 每一独立生产过程制造的零件,如相同的装配线和/或工作单元、多腔冲模、铸模、工装及仿形模的每一腔位的零件都必须进行测量,并对代表性的零件进行试验。 PPAP要求 • 供应商必须满足所有规定要求,如设计记录、规范,对于散装材料,还需要有散装材料要求的审核清单。 • I任何不符合要求的检测结果都会成为供应商不得提交零件、文件和/或记录的理由。 • PPAP的检验和试验必须由有资格的实验室完成。所使用的商业性/独立的实验室必须是获得认可的实验室机构。 • 供应商委托商业性实验室做试验时,必须用带有实验室名称的报告格式或是采用正规的实验室报告提交试验结果。报告中必须填写清楚实验室名称、试验日期、试验所采用的标准。对任何试验结果只笼统性地描述其符合性是不可接受的

一文读懂JAVA多线程

杀马特。学长 韩版系。学妹 提交于 2020-08-14 14:05:55
背景渊源 摩尔定律 提到多线程好多书上都会提到摩尔定律,它是由英特尔创始人之一Gordon Moore提出来的。其内容为:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。换言之,每一美元所能买到的电脑性能,将每隔18-24个月翻一倍以上。这一定律揭示了信息技术进步的速度。 可是从2003年开始CPU主频已经不再翻倍,而是采用多核,而不是更快的主频。摩尔定律失效。那主频不再提高,核数增加的情况下要想让程序更快就要用到并行或并发编程。 并行与并发 如果CPU主频增加程序不用做任何改动就能变快。但核多的话程序不做改动不一定会变快。 CPU厂商生产更多的核的CPU是可以的,一百多核也是没有问题的,但是软件还没有准备好,不能更好的利用,所以没有生产太多核的CPU。随着多核时代的来临,软件开发越来越关注并行编程的领域。但要写一个真正并行的程序并不容易。 并行和并发的目标都是最大化CPU的使用率,并发可以认为是一种程序的逻辑结构的设计模式。可以用并发的设计方式去设计模型,然后运行在一个单核的系统上。可以将这种模型不加修改的运行在多核系统上,实现真正的并行,并行是程序执行的一种属性真正的同时执行,其重点的是充分利用CPU的多个核心。 多线程开发的时候会有一些问题,比如安全性问题,一致性问题等,重排序问题,因为这些问题然后大家在写代码的时候会加锁等等

Java并发编程:volatile关键字解析

纵然是瞬间 提交于 2020-08-14 13:00:28
Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。   volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volatile关键字的场景。   以下是本文的目录大纲:   一.内存模型的相关概念   二.并发编程中的三个概念   三.Java内存模型   四..深入剖析volatile关键字   五.使用volatile关键字的场景   若有不正之处请多多谅解,并欢迎批评指正。   请尊重作者劳动成果,转载请标明原文链接:   http://www.cnblogs.com/dolphin0520/p/3920373.html 一.内存模型的相关概念   大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题

小白也能看懂的锁升级过程和锁状态

自古美人都是妖i 提交于 2020-08-14 08:50:22
一、前言 锁的状态总共有四种,级别由低到高依次为:无锁、偏向锁、轻量级锁、重量级锁,这四种锁状态分别代表什么,为什么会有锁升级?其实在 JDK 1.6之前,synchronized 还是一个重量级锁,是一个效率比较低下的锁,但是在JDK 1.6后,Jvm为了提高锁的获取与释放效率对(synchronized )进行了优化,引入了 偏向锁 和 轻量级锁 ,从此以后锁的状态就有了四种(无锁、偏向锁、轻量级锁、重量级锁),并且四种状态会随着竞争的情况逐渐升级,而且是不可逆的过程,即不可降级,也就是说只能进行锁升级(从低级别到高级别),不能锁降级(高级别到低级别),意味着偏向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率。 二、锁的四种状态 在 synchronized 最初的实现方式是 “阻塞或唤醒一个Java线程需要操作系统切换CPU状态来完成,这种状态切换需要耗费处理器时间,如果同步代码块中内容过于简单,这种切换的时间可能比用户代码执行的时间还长”,这种方式就是 synchronized实现同步最初的方式,这也是当初开发者诟病的地方,这也是在JDK6以前 synchronized效率低下的原因,JDK6中为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”。 所以目前锁状态一种有四种,从级别由低到高依次是:无锁

浅谈常见数据结构和算法的应用系列(一)

痴心易碎 提交于 2020-08-14 07:01:55
近来有小伙伴问我:刷leetcode真的有用吗,觉得收益很小,越刷越迷茫了… 诚然每个人刷题的目的不一样,233酱还不是为了能水几篇文章… 当然不止。我觉得刷题是一件有意思的事,就像小猫小狗咬自己尾巴,玩弄的不亦乐乎。比喻可能不太恰当,是有种沉迷小游戏的感觉。 可是在艰难打野的过程中,我们不要忘了,最重要的是: 了解每种技能包的特点,适合解决的问题和场景。在特定实战场景下能够使用特定的技能包,自创技能包。这才是武功的至高境界。 装X结束,浅谈开始。。 数据结构是指:一种数据组织、管理和存储的格式,它可以帮助我们实现对数据高效的访问和修改。 数据结构 = 数据元素 + 元素之间的结构。 如果说数据结构是造大楼的骨架,算法就是具体的造楼流程。流程不同,效率资源不同。我会两者结合简单探讨下他们的特点和应用。 常见的数据结构可分为: 线性结构、树形结构 和 图状结构 。 常见的算法有: 递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法 等。 本文从 线性数据结构、递归 和 排序算法 谈起。 线性结构 线性结构:是指数据排成像一条线一样的结构。每个元素结点最多对应一个前驱结点和一个后继结点。如数组, 链表,栈 ,队列等。 数组 数组是是由相同类型的元素(element)的集合所组成的数据结构,分配一块连续的内存来存储。利用 元素的下标位置

synchronized锁升级过程和实现原理

岁酱吖の 提交于 2020-08-14 06:39:12
一.synchronized升级过程 在最开始JDK1.0,1.2的时候,synchronized就是重量级锁,后来JDK对synchronized进行了一系列优化,这个优化就是有个升级过程。这个升级过程被markword清晰地进行了记录。 整个锁升级的过程大概分为: new-->偏向锁-->轻量级锁(无锁,自旋锁,自适应自旋)-->重量级锁 我们结合下面这张图具体谈一下 从刚刚new出来的时候,首先上的是偏向锁,出现争用,升级为轻量级锁,竞争状态变得特备激烈,变为重量级锁。这些信息全部记录在markword的8个字节中。这张图也说明了在不同的状态下,这64位到底是什么样的布局。在无锁态,头三位代表一个没有锁的状态。如果升级为偏向锁,也是头三位代表它为偏向锁。如果再升级为更重量级的锁,只用两位代表就行了。 刚new出来时,我们看下这64位都对应什么东西? 分代年龄占4位,其最大值即为15。这也就是我们所说的当分代年龄达到最大值时,就从年轻代变为老年代。 hashcode占31位,准确来说,对hashcode方法进行调用之后,它才会把这个值存进来,没有进行调用,这里面是没有值的。 我们看下调用前后内存布局变化: 下面再谈下偏向锁,第一个拥有锁对象的线程,先不上那么重量级的锁,先给它贴个标签, 类比于在卫生间门上贴张写有名字的纸。偏向锁的意思就是它偏向于第一个刚刚进来的线程

同样是线程安全,ConcurrentHashMap 和 Hashtable 区别?

无人久伴 提交于 2020-08-14 05:04:05
同样是线程安全,ConcurrentHashMap 和 Hashtable 区别? 文章目录 同样是线程安全,ConcurrentHashMap 和 Hashtable 区别? 前言 1.出现的版本不同 2.实现线程安全的方式不同 3.性能不同 4.迭代时修改的不同 5.总结 6.参考 前言 通过之前的文章 《HashMap 为什么线程不安全?》 ,我们都知道 HashMap 不是线程安全的,而本章中 ConcurrentHashMap 和 Hashtable 它们两个都是线程安全的,那它们有哪些不同点呢?我们从以下四个角度出发,去分析它们的不同点。 1.出现的版本不同 我们先从表面的、显而易见的出现时间来分析。Hashtable 在 JDK1.0 的时候就存在了,并在 JDK1.2 版本中实现了 Map 接口,成为了集合框架的一员。而 ConcurrentHashMap 则是在 JDK1.5 中才出现的,也正是因为它们出现的年代不同,而后出现的往往是对前面出现的类的优化,所以它们在实现方式以及性能上,也存在着较大的不同。 2.实现线程安全的方式不同 Hashtable 实现并发安全的原理是通过 synchronized 关键字,Collections.SynchronizedMap(new HashMap()) 的原理和 Hashtable 类似,也是利用

AtomicInteger源码解析-Java8

烈酒焚心 提交于 2020-08-13 18:58:16
前言   最近在看JDK源码,发现好多地方都用到了AtomicInteger原子类,所以打算将AtmoicInteger的源码过一遍。   本文将分为两部分,一部分是简单介绍AtmoicInteger的用法,第二部分是AtomicInteger的源码,我在源码中做了比较详细的注释。 简单使用AtomicInteger   下面介绍AtomicInteger的一部分API的使用示例,未列出的api可以在后面的源码中看到用法 package cn.ganlixin; import org.junit.Test; import java.util.concurrent.atomic.AtomicInteger; /** * 描述: * 测试使用AtomicInteger * * @author ganlixin * @create 2020-06-11 */ public class TestAtomicInteger { @Test public void test() { AtomicInteger atomicInteger = new AtomicInteger(); // AtomicInteger ai = new AtomicInteger(10); 赋初始值为10 System.out.println(atomicInteger.get()); // 0 // 修改值

字节跳动Java岗4面面经分享:JVM+索引+Redis +手撕算法+CAS

我的未来我决定 提交于 2020-08-13 18:42:06
字节跳动一面: JVM的组成; 多态的实现; 内部类为何可以访问外部类对象的属性及方法; HashMap的源码Redis dictht源码分析、存放数据时发现正在扩容会怎么样: 如何判断SQL语句用到了哪些锁; MySQL索引的类型; Redis V.S. Memcached; MySQL主从复制的方式, CAS原理、含义、底层实现、存在的问题; 项目相关问题; 手撕算法:变形的二分查找。 字节跳动二面: B树什么时候的高度会变高; 数据库隔离级别、索引、RR隔离级别下的SQL查询结果; 多进程与多线程模式的区别; 守护进程、僵尸进程、 孤儿进程,如何创建守护进程; 一次HTTP请求涉及的网络协议及全过程; 手撕算法:系统用户在线峰值及持续时间统计。 字节跳动三面: Java存在内存溢出的现象吗,内存的分配方式、GC机制; final、finally fialize 的区别与用法; 设计模式之单例模式; Java的反射、含义、使用、底层实现; 悲观锁、乐观锁在数据库、Java中的实现; TCP拥塞控制原理; time-wait连接过多的原理如何解决; 手撕算法:子串匹配问题。 字节跳动四面: 项目介绍; 请介绍一下你了解的源码; 手撕算法:三面手撕算法变形(未能想出最优解,还是太菜了) ; 系统设计。 整体来讲,头条的面试官的水平非常高、善于引导面试者,整个面试过程十分享受