霹雳啪啦程序汪


  • 首页

  • 归档

  • 标签

Java动态代理

发表于 2016-07-09   |     |   阅读次数

动态代理在框架层面大量使用,比如AOP框架, Retrofit等。这里学习下Java的动态代理。

静态代理

静态代理是设计模式中的一种,通过对原始对象提供一个代理类,实现在不改变原始类的情况下,改变原始类的方法。

静态代理是在程序运行前就需要写好代理类,确定好代理类和被代理类的关系。缺点就是对于每个被代理类,都需要写个代理类与之对应。


动态代理

概念

与静态代理不同,动态代理的代理类是在运行时创建的,即代理类和被代理类的关系是在运行时才确定的。好处在于可以处理被代理类预先不知道的情况,而且也解决了静态代理的缺点,通过一个类便可以代理多个原始类。

阅读全文 »

Java注解学习(二)

发表于 2016-07-03   |     |   阅读次数

上一篇博客关注点在利用反射解析运行时的注解,这篇学习下利用apt来解析编译时的注解。


APT

概念
Annotation Processor Tool(注解处理器工具)是javac的一个工具,它用来在编译时去扫描和处理注解。你可以自定义一些注解,然后注册相应的注解处理器来处理你的自定义注解。

用途
利用apt来解析编译时注解的作用通常是用来生成文件,比如可以用来生成.java代码,而且apt是在javac编译代码之前,意味着我们生成的代码也会被编译。

阅读全文 »

Java注解学习(一)

发表于 2016-06-30   |     |   阅读次数

注解基础知识

概念

之前在学习Python的时候,有用到python里面的注解(应该叫装饰器), 它实际上是对函数的包装。
Java里面的注解概念和Python还是不一样。使用Java的注解相当于是在代码中嵌入一些元数据,然后利用编译器,反射等机制来解析它。

分类

元注解
元注解的作用是来负责对注解进行标注,用来定义注解的。

阅读全文 »

Java concurrent包学习(四)

发表于 2016-06-22   |     |   阅读次数

上一篇通过使用锁来保证线程安全,这一篇学习使用原子变量。


CAS(compare-and-swap)

概念
CAS是在CPU层面支持的指令,现代的CPU大部分都支持这个指令,它能对内存的共享数据进行原子的操作,因此可以保证线程安全。

语义
这个操作用C语言来描述,就是下面的代码:

1
2
3
4
5
6
7
int compare_and_swap (int* reg, int oldval, int newval)
{
int old_reg_val = *reg;
if (old_reg_val == oldval)
*reg = newval;
return old_reg_val;
}

阅读全文 »

Java concurrent包学习(三)

发表于 2016-06-08   |     |   阅读次数

在编写多线程程序的时候,需要考虑到对共享变量的访问。这篇学习下并发编程中锁的使用。


Synchronized

在JDK5之前,通常是使用synchronized关键字来实现同步。

synchronized简介
考虑一种简单的场景,假设有个方法是让int变量加1。

1
2
3
4
5
int count = 0;

void increment() {
count = count + 1;
}

阅读全文 »

Java concurrent包学习(二)

发表于 2016-06-04   |     |   阅读次数

在Java8 stream部分和上一篇博客都有用到ForkJoinPool,这个是ForkJoin框架创建的线程池。所以开始了解下这个是ForkJoin框架是什么。


线程池

先学习下线程池的知识。

概念
线程池是一种预先创建多个线程的机制。预先启动若干个线程,放入池子中,让线程处于睡眠状态,这样不会耗费CPU资源。当一个请求来到的时候,从线程池中唤醒一个睡眠的线程来处理这个请求,请求完成后,再让线程回到睡眠状态。

好处

  1. 避免线程的反复创建,销毁产生的开销。
  2. 请求任务来到的时候,直接从线程池中取出线程来用,提高响应速度,无需等待新线程的创建。
  3. 线程池可以有效管理线程的数量,避免无节制的创建线程。
阅读全文 »

Java concurrent包学习(一)

发表于 2016-05-31   |     |   阅读次数

在JDK5之后,引入了java.util.concurrent包,增加了很多功能来更方便的处理并发编程。JDK8又加入异步处理,并发集合的增强等更强大的功能。在这里记录下学习过程。


Executor

在JDK5之前,启动线程通常采用下面的方法。

1
2
3
4
5
6
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}).start();

Executors引入了异步处理和线程池机制,由于线程的创建和销毁会产生很大的开销,所以利用线程池机制,重用线程而不是新创建线程,避免了由于创建线程而带来的时间延迟。

阅读全文 »

Openstack开发环境搭建

发表于 2016-05-15   |     |   阅读次数

环境准备

我使用的虚机是VirtualBox安装CentOS 7
安装2张网卡。一个NAT网卡, 用于和外网通信,一个Host only网卡,用于和宿主机通信。

阅读全文 »

Ternya

发表于 2016-05-07   |     |   阅读次数

写tenrya的初衷

现在部门做的项目是个基于openstack的云平台,其中一个模块是需要监听openstack的notification来进行响应,现有后台代码是用Java写的,逻辑是用switch-case判断notification的event_type来调用对应的响应类。可以想象到这段switch-case有多长。

希望用更优雅的方式来做这个事,所以就把这块抽离了出来,写个了简单的python library。
ternya的目的是为了更方便的接收和处理openstack notification。

阅读全文 »

Java函数式编程

发表于 2016-04-30   |     |   阅读次数

通过Python接触到函数式编程后, 希望写Java的时候也可以写的这样简洁,优雅。幸好Java8也推出了函数式编程的概念。

Java8的新特性中,最吸引人的应该就是lambda和stream了吧。

Lambda

Functional Interface

functional interface是只包含一个abstract method的接口。可以通过@FunctionalInterface注解显式的标记接口,表明它是个functional interface。如果往里面加入第2个abstract method,编译器就会报错。但default method和statis method不会违反functional interface的规则。

1
2
3
4
5
6
7
8
9
10
11
12
@FunctionalInterface
public interface MyFunctionalInterface {
void function(String input);

default void default_function() {
System.out.println("This is default function");
}

static void static_function() {
System.out.println("This is static function");
}
}

阅读全文 »
1234
ndrlslz

ndrlslz

Just Record Something

39 日志
0 分类
0 标签
GitHub Weibo
© 2021 ndrlslz
由 Hexo 强力驱动
主题 - NexT.Pisces