摘要: 我们不仅仅希望防止某个线程使用某个状态时,另一个线程在修改它;我们还希望某个线程修改了某个状态后,其他线程能够看到状态的变化。 一、可见性 重排序:在没有同步的情况下,编译器、处理器可能对代码的执行顺序进行一些调整 例如如下代码,由于没有使用同步机制,读线程可能看不见ready的修改,而一直循环下去 阅读全文
posted @ 2018-05-11 16:06 linghu_java 阅读(331) 评论(0) 推荐(0) 编辑
摘要: 一、设计线程安全的类 找出构造对象状态的所有变量(若变量为引用类型,还包括引用对象中的域) 约束状态变量的不变性条件 建立对象状态的并发访问管理策略(规定了如何维护线程安全性) 1、收集同步需求(找出复合操作、多个变量遵循原子性的操作等) 2、依赖状态的操作(找出操作是否基于先验条件,例:取出当队列 阅读全文
posted @ 2018-05-11 16:04 linghu_java 阅读(448) 评论(0) 推荐(0) 编辑
摘要: 委托是创建线程安全类的一个最有效的策略:只需让现有的线程安全类管理所有的状态即可。 一、同步容器类 1、同步容器类的问题 同步容器类都是线程安全的,容器本身内置的复合操作能够保证原子性,但是当在其上进行客户端复合操作则需要额外加锁保护其安全性 由于同步容器类要遵守同步策略,即支持客户端加锁,但必须清 阅读全文
posted @ 2018-05-11 16:01 linghu_java 阅读(308) 评论(0) 推荐(0) 编辑
摘要: 任务:通常是一些抽象的且离散的工作单元。大多数并发应用程序都是围绕"任务执行"来构造的,把程序的工作分给多个任务,可以简化程序的组织结构便于维护 一、在线程中执行任务 任务的独立性:任务并不依赖于其他任务的状态,结果和边缘效应。独立的任务可以实现并行执行 1、串行的执行任务 所有的任务放在单个线程中 阅读全文
posted @ 2018-05-11 15:57 linghu_java 阅读(472) 评论(0) 推荐(0) 编辑
摘要: 取消和关闭任务的方法:标志状态域、中断、Future、重写不可中断的阻塞的interrupt()方法、通过线程池的shutdown()和shutdownNow()方法、生产者消费者中加入毒丸对象、try finally中处理非常正线程终止。 阅读全文
posted @ 2018-05-11 15:53 linghu_java 阅读(409) 评论(0) 推荐(0) 编辑
摘要: 一、在任务和执行策略之间隐性耦合 Executor框架将任务的提交和它的执行策略解耦开来。虽然Executor框架为制定和修改执行策略提供了相当大的灵活性,但并非所有的任务都能适用所有的执行策略。 依赖性任务:依赖其他同步任务的结果,使其不得不顺序执行,影响活跃性 使用线程封闭的任务:在单线程的Ex 阅读全文
posted @ 2018-05-11 15:45 linghu_java 阅读(526) 评论(0) 推荐(0) 编辑
摘要: 在安全性和活跃性之间通常存在着某种制衡 一、死锁 定义:在线程A持有锁L并想获得锁M的同时,线程B持有锁M并尝试获得锁L,线程AB均不会释放自己的锁,那么这两个线程将永远地等待下去 在数据库系统的设中考虑了检测死锁以及从死锁中恢复。JVM没有办法解决死锁,只能在编程和测试时注意不要让死锁发生 1、锁 阅读全文
posted @ 2018-05-11 15:41 linghu_java 阅读(321) 评论(0) 推荐(0) 编辑
摘要: 线程的最主要目的是提高程序的运行性能,但性能的提升会导致复杂性的提升,又会导致安全性和活跃性的风险 一、对性能的思考 提升性能意味着用更少的资源做更多地事情。要想通过并发来获得更好的性能,就要更有效地利用现有处理资源 线程使用的额外的性能开销:线程之间的协调(例如加锁、触发信号以及内存同步等),增加 阅读全文
posted @ 2018-05-11 15:36 linghu_java 阅读(340) 评论(0) 推荐(0) 编辑
摘要: 一、Lock与ReentrantLock Lock接口中定义了一种无条件、可轮询的、定时的以及可中断的锁获取操作,所有加锁和解锁的方法都是显式的。 ReentrantLock实现了Lock接口,并提供了与synchronized相同的互斥性和内存可见性。ReentrantLock同样提供了可重入的加 阅读全文
posted @ 2018-05-11 15:32 linghu_java 阅读(314) 评论(0) 推荐(0) 编辑
摘要: 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。 以下是本文目录大纲: 一.CountDownLatch用法 二.CyclicBarrier用法 三.Se 阅读全文
posted @ 2018-05-11 11:34 linghu_java 阅读(314) 评论(0) 推荐(0) 编辑
摘要: 问题: A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null. Return a deep 阅读全文
posted @ 2018-05-07 11:27 linghu_java 阅读(1987) 评论(0) 推荐(0) 编辑
摘要: 网页布局(layout)是 CSS 的一个重点应用。 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。 2009年,W3C 提出了一种新的方案 Flex 布局,可以简便、完整、响应式 阅读全文
posted @ 2018-05-05 16:13 linghu_java 阅读(282) 评论(0) 推荐(0) 编辑
摘要: 微信小程序上线大半年,大部分技术原理也有文章介绍了,本文尝试从需求出发探讨微信小程序技术方案的来源,以及最近公测的支付宝小程序技术方案上的考量。 微信小程序 微信小程序的需求是让第三方开发者可以接入,可以使用微信的提供的接口去开发应用嵌入在微信里。对于这个需求,最简单的实现方案是:让外部开发者开发纯 阅读全文
posted @ 2018-05-05 11:20 linghu_java 阅读(338) 评论(0) 推荐(0) 编辑
摘要: 1、下载单个文件,默认将输出打印到标准输出中(STDOUT)中 2、通过-o/-O选项保存下载的文件到指定的文件中:-o:将文件保存为命令行中指定的文件名的文件中-O:使用URL中默认的文件名保存文件到本地 同样可以使用转向字符">"对输出进行转向输出 同时获取多个文件 若同时从同一站点下载多个文件 阅读全文
posted @ 2018-05-04 21:22 linghu_java 阅读(784) 评论(0) 推荐(0) 编辑
摘要: 第一部分:What 在Java中一般通过继承Thread类或者实现Runnable接口这两种方式来创建多线程,但是这两种方式都有个缺陷,就是不能在执行完成后获取执行的结果,因此Java 1.5之后提供了Callable和Future接口,通过它们就可以在任务执行完毕之后得到任务的执行结果。本文会简要 阅读全文
posted @ 2018-05-04 17:49 linghu_java 阅读(3557) 评论(0) 推荐(0) 编辑
摘要: Future是我们在使用java实现异步时最常用到的一个类,我们可以向线程池提交一个Callable,并通过future对象获取执行结果。本篇文章主要讲述了JUC中FutureTask中的一些实现原理。使用的jdk版本是1.7。 Future Future是一个接口,它定义了5个方法: 简单说明一下 阅读全文
posted @ 2018-05-04 15:47 linghu_java 阅读(744) 评论(0) 推荐(0) 编辑
摘要: 上手了Android N Preview,第一个不能错过的新特性就是App分屏的支持。Android7.0原生系统就可以支持两个App横屏并排或者竖屏上下摆放了。第二个新特性就是在Android TV上,原生系统也可以支持App实现画中画,用户可以一边看视频一边操作其他的应用。 其实早先在国内部分厂 阅读全文
posted @ 2018-05-02 16:19 linghu_java 阅读(5592) 评论(0) 推荐(0) 编辑
摘要: 对null进行强转会不会抛错。测试结果是,如果把null强转给对象,是不会抛异常的,因为本身对象是可以为null的。但是如果是基本类型,比如 int i = (Integer)obj的强转,其实内部会调用intvalue方法去赋值给基本类型,所以这时候是会报错的。 代码如下 上面能正常执行,即把nu 阅读全文
posted @ 2018-05-02 14:21 linghu_java 阅读(8748) 评论(0) 推荐(1) 编辑
摘要: 没错,会按照顺序执行,先执行try内代码段,没有异常的话进入finally,最后返回,那么输出如下: try block, i = 2finally block i = 10main test i = 10 这个没有问题,如果我们把return语句放入try catch里又会怎么样呢 输出结果是: 阅读全文
posted @ 2018-05-02 14:01 linghu_java 阅读(372) 评论(0) 推荐(0) 编辑
摘要: 一、 android应用内消息传递的方式: 1. handler方式 不同线程间传递消息。 2. Interface接口回调方式 任意两个对象。 3. Intent进行组件间通信,广播方式。 二、单例比较好的写法: private static volatile EventBus defaultIn 阅读全文
posted @ 2018-04-29 15:00 linghu_java 阅读(3191) 评论(0) 推荐(0) 编辑
摘要: 行为模式:职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式等十一种模式。 阅读全文
posted @ 2018-04-28 11:26 linghu_java 阅读(211) 评论(0) 推荐(0) 编辑
摘要: 一、普通流 普通流中元素框的位置由元素在XHTML中的位置决定。块级元素从上到下依次排列,框之间的垂直距离由框的垂直margin计算得到。行内元素在一行中水平布置。 普通流就是html文档中的元素如块级元素、行内元素依据他们的显示属性按照在文档中的先后次序依次显示。是块级元素就占一行或多行,是行内元 阅读全文
posted @ 2018-04-27 21:11 linghu_java 阅读(500) 评论(0) 推荐(0) 编辑
摘要: 概述 结构型模式共七种: 适配器模式(Adapter) 外观模式(Facade) 桥接模式(Bridge) 装饰器模式(Decorator) 代理模式(Proxy) 享元模式(Flyweight) 组合模式(Composite) 其中又分为 接口适配:适配器、外观、桥接模式 行为扩展:装饰 性能与对 阅读全文
posted @ 2018-04-27 17:03 linghu_java 阅读(459) 评论(0) 推荐(0) 编辑
摘要: 桥接模式将抽象与具体实现分离,使得抽象与具体实现可以各自改变互不影响。桥接模式属于设计模式中的结构模式。 桥梁模式涉及的角色 抽象(Abstraction)角色:抽象定义,引用对接口对象的引用。 重新抽象(RefinedAbstraction)角色:重新抽象化角色,对父类中抽象的重新定义。 待实现接 阅读全文
posted @ 2018-04-27 11:00 linghu_java 阅读(264) 评论(0) 推荐(0) 编辑
摘要: 一、模式定义 外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。 二、模式结构 外观模式包含如下角色: 阅读全文
posted @ 2018-04-27 10:16 linghu_java 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 1. 适配器模式简介 适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适用场景: 1、已经存在的类的接口不符合我们的需求; 2、创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类( 阅读全文
posted @ 2018-04-26 15:05 linghu_java 阅读(298) 评论(0) 推荐(0) 编辑
摘要: 之前做过一个测试,反复执行过多次,发现结果是一样的: 1. 单线程下synchronized效率最高(当时感觉它的效率应该是最差才对); 2. AtomicInteger效率最不稳定,不同并发情况下表现不一样:短时间低并发下,效率比synchronized高,有时甚至比LongAdder还高出一点, 阅读全文
posted @ 2018-04-25 15:04 linghu_java 阅读(34887) 评论(5) 推荐(11) 编辑
摘要: 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及。本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑。 1、自旋锁 自旋锁 阅读全文
posted @ 2018-04-25 10:22 linghu_java 阅读(484) 评论(0) 推荐(0) 编辑
摘要: 1、设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘 阅读全文
posted @ 2018-04-20 17:34 linghu_java 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 一、什么是CGLIB? CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。 二、CGLIB原理 CGLIB原理:动态生成一个要 阅读全文
posted @ 2018-04-20 17:28 linghu_java 阅读(7376) 评论(0) 推荐(1) 编辑
摘要: 说到Android进程间通信,大家肯定能想到的是编写aidl文件,然后通过aapt生成的类方便的完成服务端,以及客户端代码的编写。不熟悉的话可以查看Android aidl Binder框架浅析; 当然今天要说的通信方式肯定不是通过编写aidl文件的方式,今天要讲Messenger。 This al 阅读全文
posted @ 2018-04-11 20:12 linghu_java 阅读(735) 评论(0) 推荐(0) 编辑
摘要: 一、什么是AIDL服务 一般创建的服务并不能被其他的应用程序访问。为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Int 阅读全文
posted @ 2018-04-11 10:56 linghu_java 阅读(7281) 评论(0) 推荐(0) 编辑
摘要: HTTP长连接和短连接 1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收 阅读全文
posted @ 2018-04-09 11:23 linghu_java 阅读(1527) 评论(0) 推荐(0) 编辑
摘要: 对称加密算法概念 加密密钥和解密密钥相同,大部分算法加密揭秘过程互逆。 特点:算法公开、(相比非对称加密)计算量小、加密速度快、效率高。 弱点:双方都使用同样的密钥,安全性得不到保证。 加密密钥和解密密钥相同,大部分算法加密揭秘过程互逆。 特点:算法公开、(相比非对称加密)计算量小、加密速度快、效率 阅读全文
posted @ 2018-04-08 15:51 linghu_java 阅读(8232) 评论(0) 推荐(0) 编辑
摘要: 一、前言 上一篇博客中,我们通过介绍dex分包原理引出了Android的热补丁技术,而现在我们将解决两个问题。 1. 怎么将修复后的Bug类打包成dex 2. 怎么将外部的dex插入到ClassLoader中 二、建立测试Demo 2.1 目录结构 2.2 源码 activity_main.xml 阅读全文
posted @ 2018-03-31 18:11 linghu_java 阅读(1361) 评论(0) 推荐(0) 编辑
摘要: 类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制.JVM中用来完成上述功能的具体实现就是类加载器.类加载器读取.class字节码文件将其转换成jav 阅读全文
posted @ 2018-03-30 21:04 linghu_java 阅读(222) 评论(0) 推荐(0) 编辑
摘要: 首先需要知道的是android中两个主要的classloader,PathClassLoader和DexClassLoader,它们都继承自BaseDexClassLoader,这两个类有什么区别呢?其实看一下它们的源码注释就一目了然了。 因为代码很少,约等于没有,这里直接贴出它们的源码,其实主要是 阅读全文
posted @ 2018-03-30 20:58 linghu_java 阅读(1688) 评论(0) 推荐(1) 编辑
摘要: 前言 没想到,65536真的很小。 1 Unable to execute dex: method ID not in [0, 0xffff]: 65536 PS:本文只是纯探索一下这个65K的来源,仅此而已。 到底是65k还是64k? 都没错,同一个问题,不同的说法而已。65536按1000算的话 阅读全文
posted @ 2018-03-23 11:25 linghu_java 阅读(865) 评论(0) 推荐(0) 编辑
摘要: 一、分包的原因: 当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机器无法安装,提示INSTALL_FAILED_DEXOPT 2. 方法数量过多,编译时出错,提示: Conversion to Dalvik format failed 阅读全文
posted @ 2018-03-21 10:54 linghu_java 阅读(3706) 评论(0) 推荐(1) 编辑
摘要: Java虚拟机指令是由(占用一个字节长度、代表某种特定操作含义的数字)操作码Opcode,以及跟随在其后的零至多个代表此操作所需参数的称为操作数 Operands 构成的。由于Java虚拟机是面向操作数栈而不是寄存器的架构,所以大多数指令都只有操作码,而没有操作数。 字节码指令集是一种具有鲜明特点、 阅读全文
posted @ 2018-03-17 15:53 linghu_java 阅读(485) 评论(0) 推荐(0) 编辑