大巧不工


  • 首页

  • 归档

  • 标签

  • 分类

  • 搜索

关于注解应该知道的

发表于 2019-05-03

什么是注解

其实注解并不复杂,使用注解一定会有三个过程:定义注解,使用注解,读取注解。我们一步一步来看:

定义注解

定义没什么好说的

1
2
3
4
5
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Six{
String name() default "nanwei";
}

  1. 使用@interface定义注解
  2. @Target和@Retention是元注解,就是注解的注解。。。。。,一共四种
    1. Target表示注解的作用目标,看代码
阅读全文 »

new的时候发生了什么

发表于 2019-04-09

类加载器

ClassLoader是负责加载类的对象。ClassLoader类是一个抽象类,给定一个类的二进制名(任何一个类都有一个根据JLS规范定义的String类型的二进制名,ClassLoader中使用该名进行加载,其实在jni开发中,用的也是这个,详见jni tips),典型的策略是将二进制名转换成文件名然后从文件系统读取class文件。
每个class都包含一个classloader的引用,数组类型的class不是有classloader创建的,而是在运行时由java runtime自动创建,数组类型获取classloader时,返回的是数组元素的类型。如果数组元素是基本类型或者是由bootstrap classloader加载的类(比如rt.jar包),那么没有classloader。
如下代码:

阅读全文 »

null是什么

发表于 2019-04-09
null是什么

我们会围绕这几个问题进行探讨

  1. null属于什么类型
  2. null是某个具体的实例么
  3. null是什么
  4. null在内存中怎么表示
    我们从null属于什么类型说起
阅读全文 »

对于枚举enum该知道的

发表于 2019-04-08

枚举的由来

首先是枚举类型的由来,在编程语言还没有引入枚举类型之前,程序员用来表示枚举类型的模式一般是声明一组具名的int常量,比如表示水果Fruit:

1
2
3
4
public static final int APPLE_FUJI = 0;
public static final int APPLE_PIPPIN = 1;
public static final int ORANGE_NAVEL = 2;
public static final int ORANGE_TEMPLE = 3;

这叫int枚举模式,这种模式有很多缺陷,在类型安全性和使用方便性上没有任何帮助。因为都是int类型,所以需要apple类型的时候传入orange编译器也不会报错。甚至apple和orange之间还能使用==进行比较而不会出现编译错误,这样带来的后果是灾难性的,隐藏的bug很难找出来。另外这种模式对于debug也很不方便(都是数字,没有太大用处)。也有一种模式使用String代替int,叫String枚举模式,但是导致性能问题,因为很依赖字符串操作;而且字符串书写错误也会造成很多问题,因为编译时并不会报错。

阅读全文 »

volatile

发表于 2019-04-07

生产者消费者模式

发表于 2019-04-07

前言

生产者-消费者模式是一个十分经典的多线程并发协作的模式,弄懂生产者-消费者问题能够让我们对并发编程的理解加深。生产者消费者模式,主要探讨的问题是,两个线程(生产者与消费者),一块共享区域,生产者负责生产同时操作共享区域,消费者负责消费同时操作共享区域,在这个过程中,生产者与消费者没有任何耦合,互相不关心对方的行为,那么这种情况下,考虑如下场景:
假如共享区域有商品5个,消费者消耗一个商品后去检查数量时,消费者期待的是还剩下4个,但是由于没有做线程并发协作,在消耗完商品后的时间点,生产者刚好生产好一个商品并要将商品数量+1,在+1之后,消费者才去检查数量,这时候的数量还是5与他的期望不符,这就是问题所在,我们讨论的也都是要解决这个问题。
当然,除了上述假设情况之外,我们还得考虑,共享区域的数据变化如何阻塞及唤醒线程

  1. 如果共享数据区已满的话,阻塞生产者继续生产数据放置入内
  2. 如果共享数据区为空的话,阻塞消费者继续消费数据
    其实说到底,就是要实现线程同步,java中实现线程同步的方法主要有
  3. Sychronized,对应的要使用Object的wait和notify机制
  4. Lock,对应的要使用Lock的Condition的await/signal机制
    另外,使用BlockingQueue也能实现生产者消费者模式
阅读全文 »

Java线程安全(1)-Sychronized

发表于 2019-04-07

java锁

java的锁机制并不复杂,谈到锁一般会提到关键字Sychronized和类Lock以及cas策略,提到锁的分类会提到可重入锁、可中断锁、公平锁/非公平锁、乐观锁/悲观锁等等,其实了解了原理之后,一切都会豁然开朗。我们一步一步来。

线程安全

在了解锁机制之前,我们得先清除为什么会有锁,原因是保证线程安全。在编程中,当多个线程都要对某一变量进行操作时,我们必须保证这些线程在自己操作后所得的结果是正确的,这就是线程安全。而在java中,根据线程安全强度由强至弱排序,将操作共享数据氛围以下五类:
不可变:数据不可变,线程安全也就无从谈起
绝对线程安全:几乎无法实现
相对线程安全:我们通常说的线程安全
线程兼容:值对象本身不是线程安全的,但是我们可以通过调用手段达到安全。
线程对立:无论何种情况,无论调用端使用何种方式,都无法使用并发代码,因为java天生支持多线程,所以这个思想无用
所以我们在java中说的并发同步指的就是相对线程安全和线程兼容这两个概念。

阅读全文 »

制作抖音视频

发表于 2019-02-23 | 分类于 技术

起因

短视频在近两年大火,尤其抖音快手等,一个庞大的新媒体流量入口已然成型,刚好工作中接触短视频较多,就想自己运营个抖音号,本来以为市场上已有的一些手机app应该可以满足需求,没想到不是模板固定就是体验太差,又或者输出视频清晰度不够,就干脆拿一些用过的视频工具来做了

工具

  • iMovie:主要用来截取片段,当然FFmpeg也完全可以胜任,但是视觉化的iMovie或者其他商业软件会更方便
  • ffmpeg:主要用来裁剪视频添加水印

    FFmpeg

  • 官网 https://ffmpeg.org/ffmpeg.html
  • 命令基本公式
    ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
阅读全文 »

Weex系列(1)-环境与工具

发表于 2018-11-29

什么是Weex

Weex官网的一句话介绍:Weex 是一个使用 Web 开发体验来开发高性能原生应用的框架。
Weex是由阿里巴巴开发的,基于先进Web技术,使用同一套代码来构建 Android、iOS 和 Web 应用。具体来讲,在集成了 WeexSDK 之后,你可以使用 JavaScript 和现代流行的前端框架来开发移动应用。

  • 支持的前端框架
    • Vue.js
    • Rax

环境搭建

阅读全文 »

AnyTest-Introductin

发表于 2018-11-03 | 分类于 项目

AnyTest

这是什么

这是一个非常有意思的希望能够提高学生或者文字记忆者效率的一款应用。这款app基于MVP模式,使用Realm进行数据存储,使用RxJava完成异步调用,使用lombok减少代码量,使用butterknife进行view绑定,使用dagger2完成依赖注入,可以说这个项目是使用了相对来说比较新潮的技术来开发的,这也是我做这个项目的初衷,就是接触更多的技术。如果你也对这些项目有兴趣,不防在这里集中的了解一下。

阅读全文 »
123…5
99个小号

99个小号

41 日志
4 分类
14 标签
GitHub Weibo
© 2017-12 — 2019 99个小号