状态变量

通过一个生活中的案例场景,揭开并发包底层AQS的神秘面纱

烈酒焚心 提交于 2019-12-02 19:31:26
本文导读 生活中案例场景介绍 联想到 AQS 到底是什么 AQS 的设计初衷 揭秘 AQS 底层实现 最后的总结 当你在学习某一个技能的时候,是否曾有过这样的感觉,就是同一个技能点学完了之后,过了一段时间,如果你没有任何总结,或者是不经常回顾,遗忘的速度是非常之快的。 忘记了之后,然后再重新学,因为已经间隔了一段时间,再次学习又当做了新的知识点来学。这种状态如此反复,浪费了相同的时间,但学习效果却收效甚微。 每当遇到这种情况,我们可以停下来,思考一下。对于某一个技术知识点理解起来不是那么好懂的时候,或者是学习起来有点吃力的时候,咱们可以尝试找找生活中的例子来联想下。 因为技术源于生活。 找到一个合适的生活案例,然后结合你自己做笔记总结和动手实践的过程。定期的去回顾一下,慢慢的就会理解的更加透彻。 1、生活中案例场景介绍 今天我们就举一个生活中的例子来理解下并发底层的AQS。 大家如果去过某些大医院的话,就能知道,由于互联网的快速发展,医院的挂号、交费、取药的流程都是比较方便的,交费也可以使用支付宝、微信支付了,而不用带现金了。 医生开完单子,交费完成 ,单子上都会有一个长条二维码,可以直接在取药的地方自助扫码,叫号系统自动分配取药窗口,然后你在关注下指定窗口等待着叫号就可以了,叫到你的时候再过去取药,而不需要一直在等待着。 我们用一张图来直观的感受下: 这里面涉及到了几个角色: 1

Java线程面试题 Top 50

白昼怎懂夜的黑 提交于 2019-12-02 12:48:21
1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点。欲了解更多详细信息请 点击这里 。 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。更多详细信息请 点击这里 。 3) 如何在Java中实现线程? 在语言层面有两种方式。java.lang.Thread 类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行,由于线程类本身就是调用的Runnable接口所以你可以继承java.lang.Thread 类或者直接调用Runnable接口来重写run()方法实现线程。更多详细信息请 点击这里 . 4) 用Runnable还是Thread? 这个问题是上题的后续,大家都知道我们可以通过继承Thread类或者调用Runnable接口来实现线程,问题是,那个方法更好呢?什么情况下使用它?这个问题很容易回答

Java常见的面试题

…衆ロ難τιáo~ 提交于 2019-12-02 06:19:46
Java 基础知识点 Java 常见集合 高并发编程(JUC 包) JVM 内存管理 Java 8 知识点 网络协议相关 数据库相关 MVC 框架相关 大数据相关 Linux 命令相关 面试,是大家从学校走向社会的第一步。 互联网公司的校园招聘,从形式上说,面试一般分为 2-3 轮技术面试 +1 轮 HR 面试。 但是一些公司确实是没有 HR 面试的,直接就是三轮技术面。 技术面试中,面试官一般会先就你所应聘的岗位进行相关知识的考察,也叫基础知识和业务逻辑面试。 只要你回答的不是特别差,面试官通常会说:“咱们写个代码吧”,这个时候就开始了算法面试。 也就是说,一轮技术面试 = 基础知识和业务逻辑面试 + 算法面试。 关于算法面试的总结,各位可以查阅我先前交流的 Chat:“知名互联网公司校招中常见的算法题”。 本文我们主要从技术面试聊起。技术面试包括:业务逻辑和基础知识面试。 首先是业务逻辑面试 ,也就是讲项目。 面试官会对你简历上写的若干个项目其中之一拿出来和你聊聊。在期间,会针对你所做的东西进行深度挖掘。 包括:为什么要这么做?优缺点分析,假如重新让你做一次,你打算怎么做? 等等。这个环节主要考察我们对自己做过的项目(实习项目或者校内项目)是否有一个清晰的认识。 关于业务逻辑面试的准备,建议在平时多多思考总结,对项目的数据来源、整体运行框架都应该熟悉掌握。

JS基础回顾3

孤街醉人 提交于 2019-12-02 06:02:31
AJAX AJAX:(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术 异步:javascript语言是一门“单线程”的语言,javascript就像一条流水线,仅仅是一条流水线而已,要么加工,要么包装,不能同时进行多个任务和流程,无论如何,js做事情的时候都是只有一条流水线(单线程),同步和异步的差别就在于这条流水线上各个流程的执行顺序不同。 区别: 同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务 异步任务指的是,不进入主线程、而进入"任务队列"的任务,只有等主线程任务执行完毕,"任务队列"开始通知主线程,请求执行任务,该任务才会进入主线程执行。 xml可扩展的标记语言,所有的标签都是自定义的,保存数据。(json更好的取代xml) ajax请求步骤 //1.新建ajax对象 let ajax = new XMLHttpRequest(); //2.ajax对象的open() //open(请求方式get/post,接口地址,是否异步true异步/false同步) ajax.open('get','http://localhost/JS1909/Day%2021/5.phparray.php',true); //3.ajax对象的send() ajax.send(); // ajax.readyState:就绪状态

008数据类型基础

旧时模样 提交于 2019-12-02 03:43:46
数据类型基础 一、什么是数据类型? 首先让我们回顾变量是什么:变量用来记录世界的状态。创建计算机的目的就是想要让计算机和人一样能够识别世间万物,既然计算机能够识别世间万物,那么我们来想想怎么让计算机来认识我? 我们不讲计算机怎么认识我,我们聊聊你是怎么认识我的?如果是你,你是不是会通过我的名字、年龄、身高、性别和爱好认识我。那么可想而知计算机也可以这样认识我。那么如果用计算机中的变量去记录我的这些状态,我的年龄可以用19去记录,但是我的姓名可以使用数字去记录吗?我的爱好可以用数字去记录吗?如果你说你年龄的时候,你又会用18.5岁去形容你的年龄吗?可想而知,你是不会这样做的。 通过上面一大段的陈述,其实可以明白数据类型指的就是变量值的不同类型,姓名可能是一种数据类型、年龄可能是一种数据类型、爱好可能又是另一种数据类型,至于是什么数据类型我们将在下一章详细说明。 二、为何对数据分类? 变量的是用来反映状态以及状态变化的,毫无疑问针对不同的状态就应该用不同类型的数据去标识。 三、不同数据类型 数字类型 字符串类型 列表类型 字典类型 [布尔类型]( 来源: https://www.cnblogs.com/FirstReed/p/11729646.html

初识 Shell脚本

做~自己de王妃 提交于 2019-12-01 22:11:26
摘要 什么是Shell Shell的分类 在linux上搭建Shell编程环境 Shell 如何执行 交互式程序 创建脚本 Shell脚本的参数 Shell脚本的基本元素 指定命令解读器 Shell脚本中的注释和风格 如何执行Shell程序 Shell程序的退出状态 变量和引用 变量的命令 变量的类型 变量和引号 变量的作用域 系统变量 环境变量 变量赋值 引用变量的值 清除变量 引用符号 命令替换 条件测试 条件测试 字符串测试 整数测试 文件测试 逻辑操作符 条件判断语句 多条件判断语句case 运算符 执行算术运算 位运算符 自增/自减运算符 循环结构 带列表的for循环语句 类C风格的for循环语句 什么是Shell 在Linux系统中,Shell是用户与系统内核之间进行交互的接口。 Shell这个单词的意思是“外壳”,它形象地表达出了Shell的作用。在UNIX以及Linux中,Shell就是套在内核外面的一层外壳。正因为有Shell的存在,才向普通的用户隐藏了许多关于系统内核的细节。 Shell又称命令解释器,它能识别用户输入的各种命令,并传递给操作系统。它的作用类似于Windows操作系统中的命令行,但是,Shell的功能远比命令行强大得多。在UNIX或者Linux中,Shell既是用户交互的界面,也是控制系统的脚本语言。 Shell的分类 关于Shell的分类

测试开发工程师面试总结(一)——Java基础篇

微笑、不失礼 提交于 2019-12-01 18:12:43
本文面向对象:测试开发工程师(服务端自动化方向)。 随手百度一下都能找到**岗位面试总结,但是有关测开岗位的面试总结却寥寥无几。总体原因可能是这两个:1 测试行业整体水平参差不齐,导致不同公司面试的问题不能抽象出来写概览。2 很多做测开的人可能内心对这个行业缺少热爱,所以不爱去写。 在找工作的过程中发现测开被问到的非常杂,涵盖了Java基础(因为我平时使用Java语言较多)、算法、Spring基础、Linux基本命令、测试工具selenium等。现在把以上五个方面分五篇总结。 Java基础 1. 最基础的是问到Java的基本类型,引用类型 基本类型一共有八种,六种数字类型(四个整数型两个浮点型),一种字符类型,还有一种布尔型,整数型包括byte 8位 short 16位 int 32位 long64位,字符型即char 16位的Unicode字符 ,布尔型表示一位的信息。引用类型指向一个对象,指向对象的变量就是引用变量。对象 数组都是引用类型。 2. 字符串string类和stringbuffer的区别也是经常考查到的点 String类是不可变的,如果对字符串进行修改,需要使用StringBuffer和StringBuilder。StringBuffer是线程安全的,StringBuilder在Java5中被提出,她相较于StringBuffer有速度优势但是是线程不安全的

Java基础知识

穿精又带淫゛_ 提交于 2019-12-01 16:35:50
- [1. 面向对象和面向过程的区别](#1-面向对象和面向过程的区别) - [面向过程](#面向过程) - [面向对象](#面向对象) - [2. Java 语言有哪些特点](#2-java-语言有哪些特点) - [3. 关于 JVM JDK 和 JRE 最详细通俗的解答](#3-关于-jvm-jdk-和-jre-最详细通俗的解答) - [JVM](#jvm) - [JDK 和 JRE](#jdk-和-jre) - [4. Oracle JDK 和 OpenJDK 的对比](#4-oracle-jdk-和-openjdk-的对比) - [5. Java和C++的区别](#5-java和c的区别) - [6. 什么是 Java 程序的主类 应用程序和小程序的主类有何不同](#6-什么是-java-程序的主类-应用程序和小程序的主类有何不同) - [7. Java 应用程序与小程序之间有那些差别](#7-java-应用程序与小程序之间有那些差别) - [8. 字符型常量和字符串常量的区别](#8-字符型常量和字符串常量的区别) - [9. 构造器 Constructor 是否可被 override](#9-构造器-constructor-是否可被-override) - [10. 重载和重写的区别](#10-重载和重写的区别) - [11. Java 面向对象编程三大特性: 封装

【TencentOS tiny】深度源码分析(6)——互斥锁

…衆ロ難τιáo~ 提交于 2019-12-01 13:45:14
互斥锁 互斥锁又称互斥互斥锁,是一种特殊的信号量,它和信号量不同的是,它具有 互斥锁所有权、递归访问以及优先级继承 等特性,在操作系统中常用于对临界资源的 独占式 处理。在任意时刻互斥锁的状态只有两种, 开锁或闭锁 ,当互斥锁被任务持有时,该互斥锁处于闭锁状态,当该任务释放互斥锁时,该互斥锁处于开锁状态。 一个任务持有互斥锁就表示它拥有互斥锁的所有权,只有该任务才能释放互斥锁,同时其他任务将不能持有该互斥锁,这就是互斥锁的 所有权 特性。 当持有互斥锁的任务再次获取互斥锁时不会被挂起,而是能递归获取,这就是互斥锁的 递归访问 特性。这个特性与一般的信号量有很大的不同,在信号量中,由于已经不存在可用的信号量,任务递归获取信号量时会发生挂起任务最终形成 死锁 。 互斥锁还拥有 优先级继承 机制,它可以将 低 优先级任务的优先级 临时提升 到与获取互斥锁的 高 优先级任务的优先级 相同 ,尽可能 降低 优先级翻转的危害。 在实际应用中,如果想要实现同步功能,可以使用信号量,虽然互斥锁也可以用于任务与任务间的同步,但互斥锁更多的是用于临界资源的互斥访问。 使用互斥锁对临界资源保护时,任务必须先获取互斥锁以获得访问该资源的所有权,当任务使用资源后,必须释放互斥锁以便其他任务可以访问该资源(而使用信号量保护临界资源时则可能发生优先级翻转,且 危害 是不可控的)。 优先级翻转

关于vuex中的状态变量的思考???

一个人想着一个人 提交于 2019-12-01 07:53:26
store中存取的为整个项目的公共变量,通过设置mutation来改变他们 假设现有如下代码: const store = new Vuex.Store({ state: { userInfo:{ name:'' } }, mutations: { setuserInfo:(state,value) => { const obj = state; obj.userInfo = value } }, getters:{ } }) 我们定义了一个userInfo变量,通过mutation方法, 1,在页面A中 我们开启keepAlive,并在第一次mounted的时候将该页面的userInfo(记录为vara)赋值为this.$store.state.userInfo(记录为varb); 2,然后我们在B页面中改变store中的这一变量:this.$store.commit('setuserInfo',res); 3,当我们回到A页面时,发现userInfo还是改变了,那么问题来了 ,我只在mounted的时候 将varb的一份引用复制给vara,之后在B页面改变的时候 使得 vara的指向另外一个res,按理来说vara还是指向之前的varb,可是结果仍旧是vara改变了 可能的原因解释: 在3步骤中我们声明了个一个赋值操作: const obj = state; obj