初始化

双重检查锁定的缺点与改进

我的梦境 提交于 2020-03-30 12:53:35
双重检查锁定的延时初始化: 1 class DoubleCheckLocking{ 2 private DoubleCheckLocking() {} 3 private static DoubleCheckLocking instance; 4 public static DoubleCheckLocking getInstance(){ 5 if (instance == null){ 6 synchronized (DoubleCheckLocking.class){ 7 if (instance == null) 8 instance = new DoubleCheckLocking(); 9 } 10 } 11 return instance; 12 } 13 } 双重检查锁定看起来似乎很完美,但这是一个错误的优化!执行程序读取到第5行instance不为空时,instance引用的对象可能还没有完成初始化。 程序第8行所做的操作如下:   1:分配对象的内存空间   2:初始化对象   3:设置instance指向刚分配的内存地址 步骤2和3之间可能发生重排序,导致上面的问题。 解决方法:   1:不让2和3重排序   2:允许2和3重排序,但不允许其他线程“看到”这个重排序。 解决方案1:基于volatile的解决方案 1 class

NHibernate总结

南楼画角 提交于 2020-03-30 12:13:07
1.对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。 2.NHibernate 从数据库底层来持久化你的.Net 对象到关系型数据库。你的代码仅仅和对象关联,NHibernat 自动产生SQL语句,并确保对象提交到正确的表和字段中去。 3.常用对象:Configuration:配置文件和模型初始化;ISessionFactory:处理数据库所有操作;ISession:一次数据库操作;IStatelessSession:同ISession,差异是执行完操作马上关闭,不会有延迟加载数据;ITransaction:事务。 4.外连接抓取: 对一个特定关联来说,通过在XML映射文件中设置outer-join属性可以控制是否开启抓取功能。 设置hibernate.use_outer_join为false将禁用全局的外连接抓取,设置为true将启用所有一对一(one-to-one)和多对一(many to one)关联中的外连接抓取默认情况下,它被设置为auto,即自动外连接。但是,一对多关联和集合永远不会使用外连接抓取,除非对每个特定的管理进行明确声明

仿抖音上下滑动分页视频

我的未来我决定 提交于 2020-03-30 05:55:37
目录介绍 01.先来看一下需求 02.有几种实现方式 2.1 使用ViewPager 2.2 使用RecyclerView 03.用ViewPager实现 3.1 自定义ViewPager 3.2 ViewPager和Fragment 3.3 修改滑动距离翻页 3.4 修改滑动速度 04.用RecyclerView实现 4.1 自定义LayoutManager 4.2 添加滑动监听 4.3 监听页面是否滚动 4.4 attach和Detached 05.优化点详谈 5.1 ViewPager改变滑动速率 5.2 PagerSnapHelper注意点 5.3 自定义LayoutManager注意点 5.4 视频播放逻辑优化 5.5 视频逻辑充分解藕 5.6 翻页卡顿优化分析 5.7 上拉很快翻页黑屏 01.先来看一下需求 项目中的视频播放,要求实现抖音那种竖直方向一次滑动一页的效果。滑动要流畅不卡顿,并且手动触摸滑动超过1/2的时候松开可以滑动下一页,没有超过1/2返回原页。 手指拖动页面滑动,只要没有切换到其他的页面,视频都是在播放的。切换了页面,上一个视频销毁,该页面则开始初始化播放。 切换页面的时候过渡效果要自然,避免出现闪屏。具体的滑动效果,可以直接参考抖音…… 02.有几种实现方式 2.1 使用ViewPager 使用ViewPager实现竖直方法上下切换视频分析 1

Nodejs模块初始化

℡╲_俬逩灬. 提交于 2020-03-30 03:20:04
模块初始化 一个模块中的JS代码仅在模块第一次被使用时执行一次,并在执行过程中初始化模块的导出对象。之后,缓存起来的导出对象被重复利用。 主模块 通过命令行参数传递给NodeJS以启动程序的模块被称为主模块。主模块负责调度组成整个程序的其它模块完成工作。例如通过以下命令启动程序时,main.js就是主模块。 $ node main.js 完整示例 例如有以下目录。 /home/user/hello/ util/ counter.js main.js 其中counter.js内容如下: var i = 0; function count() { return ++i; } exports.count = count; 该模块内部定义了一个私有变量i,并在exports对象导出了一个公有方法count。 主模块main.js内容如下: var counter1 = require('./util/counter'); var counter2 = require('./util/counter'); console.log(counter1.count()); console.log(counter2.count()); console.log(counter2.count()); 运行该程序的结果如下: $ node main.js 1 2 3 可以看到,counter

初始化块、静态初始化块、构造函数的执行顺序

假如想象 提交于 2020-03-29 15:10:33
package com.ocr; class A { static { System.out.println("Static init A."); } { System.out.println("Instance init A."); } A() { System.out.println("Constructor A."); } } class B extends A { static { System.out.println("Static init B."); } { System.out.println("Instance init B."); } B() { System.out.println("Constructor B."); } } class C extends B { static { System.out.println("Static init C."); } { System.out.println("Instance init C."); } C() { System.out.println("Constructor C."); } } public class Main { static { System.out.println("Static init Main."); } { System.out.println("Instance init

PDO基础应用之异常处理

◇◆丶佛笑我妖孽 提交于 2020-03-29 13:32:41
思考:PDOException可以捕捉到异常,也有其他模式,那么在实际开发的时候我们到底是使用PDO的那种错误模式呢? 引入:其实PDO之所以提供了这么多模式,就是要使用人员根据实际情况来选择模式,如果一个项目中,需要我们去控制项目bug,那么就适合使用异常模式来进行处理 PDOException异常处理【掌握】 定义:PDOException 是PDO从Excetion继承的一个用于处理PDO错误的异常类,一般如果做一套扩展,都会从Exception类继承实现一套明确的错误机制(错误来自哪里) 1.要使用PDOException异常处理,需要设定PDO的错误模式为异常模式,在PDO中可以通过两种模式来实现异常模式设定 在初始化PDO对象的时候,利用第四个参数来设定 在初始化PDO之后,利用PDO::setAttrinute()方法来修改错误模式 <?php //初始化PDO时设定错误模式 $drivers=array( PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCPTION ); $link=new PDO('mysql:host=localhost;port=3306;dbname=senven;charset=utf8','root','root',$drivers); //初始化之后设置异常模式 $pdo=new PDO('mysql:host

Java虚拟机原理

北战南征 提交于 2020-03-29 07:55:49
1、编译机制 分析和输入到符号表: 词法分析:将代码转化为token序列 语法分析:由token序列生成抽象语法树 输入到符号表:将类中出现的符号输入到类的符号表 注解处理: 处理用户自定义注解,之后继续第一步 根据符号表进行语义分析并生成class文件,并进行相关优化 虚拟机数据类型、字节码文件格式、虚拟机指令集 2、执行机制 2.1、加载、链接、初始化 2.1.1、加载 双亲委派、线程上下文类加载器、Web容器、OSGi: http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 2.1.2、链接 校验:校验二进制字节码格式是否符合Java Class File Format规范 准备:为类的静态属性分配内存和默认值,并加载引用的类或接口 解析:将运行时常量池中的符号引用替换为直接引用(静态绑定) 2.1.3、初始化 类的初始化时机: 创建类的实例 初始化某个类的子类(满足主动调用,即访问子类中的静态变量、方法) 反射(Class.forName()会触发,ClassLoader.loadClass()及X.class不会触发) 访问类或接口的静态变量(static final常量除外,static final变量可以) 调用类的静态方法 java虚拟机启动时被标明为启动类的类 初始化顺序: 父类静态成员、静态代码块

Java数组声明、创建、初始化

时间秒杀一切 提交于 2020-03-29 07:49:43
数组是一种数据结构,用来存储同一类型值的集合。通过下标可以访问数组中的每一个值。 一维数组的声明 声明数组时不能指定其长度(数组中元素的个数), Java 中使用关键字 new 创建数组对象,格式为: 数组名 = new 数组元素的类型 [ 数组元素的个数 ] 实例: TestNew.java : 程序代码: public class TestNew { public static void main(String args[]) { int[] s ; int i ; s = new int[5] ; for(i = 0 ; i < 5 ; i++) { s[i] = i ; } for(i = 4 ; i >= 0 ; i--) { System.out.println("" + s[i]) ; } } } 初始化: 1. 动态初始化:数组定义与为数组分配空间和赋值的操作分开进行; 2. 静态初始化:在定义数字的同时就为数组元素分配空间并赋值; 3. 默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐士初始化。 实例: TestD.java( 动态 ) : 程序代码: public class TestD { public static void main(String args[]) { int a[] ; a =

7.数组

荒凉一梦 提交于 2020-03-28 17:25:52
一、数组的概述 1.定义   多个相同数据类型的数据按照一定的顺序排列的集合,使用一个名字命名,并通过编号的方式对这些数据进行统一管理。 2.特点   ①数组是有序排列的;   ②数组本身是引用数据类型,数组中的元素既可以是基本数据类型,也可以是引用数据类型;   ③创建数组会在内存中开辟一整块连续的空间,而数组通过数组名引用的是这块连续空间的首地址;   ④数组一旦初始化完成,其长度就确定了;数组的长度一旦确定,就不能修改;   ⑤通过索引来访问数组中的元素,速度很快 3.分类 按照维数:一维数组、二维数组、多维数组 按照数组中元素的类型:基本数据类型元素的数组、引用数据类型元素的数组 二、一维数组 1.一维数组的声明和初始化 public class test { public static void main(String[] args) { //数组的声明 int[] arr1; String arr2[]; //数组的静态初始化 arr1 = new int[]{1, 2, 3}; //数组的动态初始化 arr2 = new String[4]; //声明+初始化 int[] arr3 = new int[3]; //类型推断 String[] arr4 = {"str1", "str2", "str3"}; } } 2.访问一维数组中的元素 public class

j

最后都变了- 提交于 2020-03-28 15:00:19
j ava的StringBuffer类 (转自他人的) StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。 在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的。但是有一个最显著的区别在于,对于StringBuffer对象的每次修改都会改变对象自身,这点是和String类最大的区别。 另外由于StringBuffer是线程安全的,关于线程的概念后续有专门的章节进行介绍,所以在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。 1、StringBuffer对象的初始化   StringBuffer对象的初始化不像String类的初始化一样,Java提供的有特殊的语法,而通常情况下一般使用构造方法进行初始化。   例如: StringBuffer s = new StringBuffer();    这样初始化出的StringBuffer对象是一个空的对象。