java

java原子性

原子操作被认为是原子性; 一个操作是 不可打断 的, 一旦开始, 就运行到结束, 就认为是原子操作, 像 a=0, 只有一个操作, 不可打断, 认为是原子操作, 还有一些语句块, 用 sychronized 加锁后, 也可认为是原子操作; java 提供了位于包 java.util.concurrent.atomic 中的原子类, 使用该工具包中的原子类, 可在不加锁的情况下对单个变量安全的进行多线程编程; 包中的类 AtomicBoolean 可以用原子方式更新的 boolean 值。 AtomicInteger 可以用原子方式更新的 int 值。 AtomicIntegerArray 可以用 ...

java 基础回顾 – 初始化类的变量

创建对象的过程 1: 首次创建类或者首次访问类的静态方法/静态域, 定位到该类的 .class 文件 2: 载入 .class 文件, 静态初始化的所有动作都会执行, 因此静态初始化只在 .class 对象首次加载时进行一次 3: new 对象, 首先在堆上分配足够的空间给对象 4: 这块存储空间会被清 0, 基本类型设为默认值, 引用设为 null 5: 执行字段定义处的初始化动作 6: 执行构造器 java 中创建和初始化是一体的, 创建的时候就已经有初始化操作, 即使想延后初始化(比如像在构造器里) 基本数据类型初始化时的默认值 boolean > false char > 0 byte & ...

java 基础回顾 – Object

Object 是 java 中的基类 里面的部分方法经常需要被重写, 所以必须对 Object 内的方法有所了解. 下面是 Object 的部分源码内容和注释 package java.lang; public class Object { public Object() { } /** * 拷贝对象, 直接调用是浅拷贝, 重写后通过对非基础类型的属性调用循环调用 clone() 方法实现深拷贝 */ protected java.lang.Object clone() throws CloneNotSupportedException { } /** ...

避免单个线程独占CPU

遇到的问题 UI 跳转界面的时候发现过了好久才跳转, 最后发现后台存在的一个线程, 负责处理接收到的数据, 一秒接收到的数据大约有100多条, 由于这个子线程会运行几秒钟, 不断处理数据占用CPU, 造成 UI 线程无法刷新界面. java 多线程的知识点 解决 一开始想的是, 既然是因为子线程抢着CPU不放手, 那通知子线程放弃这次的CPU占用, 子线程一释放, UI 线程就可以拿到CPU. 然后首先想到的就是 Thread 的.yield()方法, 不过 yield() 方法在我的程序运行平台上不给力, 子线程最多暂缓10毫秒, 多数情况下子线程不会停下脚步; 然后想到了设置优 ...

java 8 Optional

java8新增工具类(java.util.Optional) 一个容器类, 表示该实例对象可能无值 使用目的是尽可能避免 NullPointerException 构建实例 返回一个空的 Optional static <T> Optional<T> empty() 返回一个非空有值的 Optional static <T> Optional<T> of(T value) 如果value是null的就返回一个空的 Optional, 否则返回非空有值的 Optional static <T> Optional<T> ofNullable(T value) 123456789 返回 ...

java 8 lambda

lambda 提供一种简化代码的方式; lambda 可以视作一个只有函数参数和方法体的方法, 没有修饰符、函数名和返回值声明; 实现内部类的效果(也内部类类似但有不同点) 能使用 lambda 的接口, 是函数式接口(接口内只有一个抽象方法) 参数 参数可以声明类型, 也可以不声明而由上下文自动推导出类型 参数放在()里, 多个参数使用 "," 分开 一个参数且类型是自动推导出来的, 那么 () 可以省略; 零个参数可以直接写(); 表达式 表达式可以有若干条, 只有一条时, "{}" 可以省略; 只有一行的话, return 可以省略 一些概 ...

java 8 Stream

Stream 说明: java 8 中新增 java.util.stream.Stream 里的类 不同于 IO 流 针对操作集合(Collection)对象里的数据 Stream 是并行化的 Stream对象可以调用多个intermediate(转换) 操作, 但只能有一个 terminal 操作; 多个转换操作会在遇到 terminal 操作之后依次执行,即取集合内的一个元素取出后就依次执行, 相当于只需要for循环一次; 流的操作 把一个数据结构包装成 Stream 后,就要开始对里面的元素进行各类操作了。常见的操作可以归类如下。 Intermediate(转换): map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 ...

单元测试 — JUnit

JUnit(测试纯java代码) 官网 注解 注解 说明 @Test 该方法是测试方法 @Before 该方法在测试方法之前执行,一个Test触发一次 @After 该方法在测试方法之后执行,一个Test触发一次 @BeforeClass 该static方法在类的所有方法之前执行 @AfterClass 该static方法在类的所有方法之后执行 @Ignore 该方法不执行 套件测试 同时运行多个文件里的单元测试用例 @RunWith(Suite.class) @Suite.SuiteClasses({ TestJunit1.class, TestJunit2.class }) ...

蓝牙固件升级总结

公司需要做一个蓝牙模块的升级程序, 需要做成一个android apk, 主要使用 java 和 C(jni) 来实现; 准备 首先就是要先熟悉固件的升级文档, 按照流程来做, 一开始没有熟悉文档, 出了一些问题; 其次我这个模块升级模式和指令模式时的串口配置是不同的, 升级时需要开启偶校验, 串口配置需要注意; 技术实现 模块的升级, 说白了也就是把将升级文件替换模块里已存在的文件, 也是数据的收发, 只不过在发文件前需要一些准备工作, 每一步按照文档就好了; 文件的读取我使用了RandomAccessFile这个java类, 再借助 MappedByteBuffer 的 get 方法获 ...

java多线程知识点

线程的状态 NEW 新建状态: new 一个线程 RUNNABLE 运行状态: 获取 CPU 时间片之后, 开始 run() 方法之后,开始执行 BLOCKED 阻塞状态: 被阻塞,等待锁的释放 WAITING 等待状态: 调用不带时间的 Object.wait, Thread.join LockSupport.park 之后 TIMED_WAITING 指定时间的等待状态: 调用带有时间参数的 Thread.sleep, Object.wait, Thread.join, LockSupport.parkNanos,LockSupport.parkUntil等方法之后 TERMINATED 死亡状态: 运行结束或者异常终止的状态 开启一个线程 Thread以Runnable对象作为构造参数,重写run 实现Runnable接口的 ...