java并发集合

birthday

常用并发集合

  • ConcurrentLinkedDeque;非阻塞式列表
  • LinkedBlockingDeque;阻塞式列表
  • LinkedTransferQueue;用于数据生成或消费的阻塞式列表
  • PriorityBlockingQueue;按优先级排序列表元素的阻塞式列表
  • DelayQueue;带有延迟列表元素的阻塞式列表
  • ConcurrentSkipListMap;非阻塞式可遍历映射
  • ThreadLocalRandom;随机数字
  • AtomicLong、AtomicIntegerArray;原子实现类

    业务类

  1. 继承或实现声明
  2. 类属性
  3. 构造方法
  4. main方法
  5. override的方法
  6. 私有方法

    队列常见的操作

  • add
  • size
  • poll
  • get
  • take(获取并移除)
  • remove
  • peek

    队列常见单词

  • first
  • last

    优先级

    如何优先,需要通过实现Comparable接口,提供compareTo方法

    延迟

    Delayed接口,实现compareTo方法,getDelay方法

java的多线程与并发

cloud

java创建线程

  • extend Thread
  • implements Runnable

java多线程计算器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Caculator implements Runnable{
public void run(){
for(int i = 0; i < 100; i ++){
System.out.println(“%s, value=%d”, Thread.currentThread().getName(), i);
}
}
}

class Application{
public static void main(){
for(int i = 0; i < 10; i ++){
Caculator c = new Caculator();
Thread t = new Thread(c);
t.start();
}
}
}

计数器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Counter implements Runnable{
private int count = 0;
public void run(){
for (int i = 0; i < 10000; i ++){
count ++;
}
}

public static int getCountValue(){
return count;
}
}

public class Application{
public static void main(){
Counter c = new Counter();
Thread t = new Thread();
t.start();
System.out.println(Count.getCountValue());
}
}

使用join方法

  • 子线程调用join方法,让main线程等待
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public class MySubThread extends Thread{
    public void run(){
    int sleepTime = 2000;
    Thread.sleep(sleepTime);
    System.out.println(“MySubThread run finished!”);
    }
    }

    public class Application{
    public static void main(){
    MySubThread t = new MySubThread();
    t.start();
    // t.join();
    System.out.println(“Main Thread finished!”);
    }
    }

    线程上锁

  • synchronized
  • lock与ReentrantedLock

    synchronized版本的计数器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    public class Counter implements Runnable{
    int count = 0;

    public static int getCount(){
    return count;
    }

    @Override
    public void run(){
    for(int i = 0; i < 10000; i ++){
    synchronized(this){
    count ++;
    }
    }
    }
    }

    public class Application{
    public static void main(){
    Counter c = new Counter();
    Thread t1 = new Thread();
    Thread t2 = new Thread();
    t1.start();
    t1.join();
    t2.start();
    t2.join();
    System.out.println(“count is: ” + Count.getCount());
    }
    }

synchronized版本的计数器之二, 使用synchronized给实例方法加锁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Counter implements Runnable{
int count = 0;

public static int getCount(){
return count;
}

@Override
public synchronized void run(){
for(int i = 0; i < 10000; i ++){
count ++;
}
}
}

public class Application{
public static void main(){
Counter c = new Counter();
Thread t1 = new Thread();
Thread t2 = new Thread();
t1.start();
t1.join();
t2.start();
t2.join();
System.out.println(“count is: ” + Count.getCount());
}
}

synchronized版本的计数器之三,使用synchronized修饰静态方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Counter implements Runnable{
int count = 0;

public static int getCount(){
return count;
}

@Override
public void run(){
for(int i = 0; i < 10000; i ++){
increase();
}
}
}

public static synchronize increase(){
count ++;
}
}

public class Application{
public static void main(){
Counter c = new Counter();
Thread t1 = new Thread();
Thread t2 = new Thread();
t1.start();
t1.join();
t2.start();
t2.join();
System.out.println(“count is: ” + Count.getCount());
}
}

笔记

  • reentrant单词也作re-entrant,entrant为进入者、新会员的意思

过去不等于未来

smile

习惯

同样的环境,同样的情况,对于同样一件事,昨天你会这样做,只随着时间的变化,你的行动一般是一样的,这就是习惯。

温水煮青蛙

思考这样一个问题,如何知道自己是不是被温水煮着的青蛙。首先,视野要大过头顶,知道什么是锅,锅下架着柴火,柴火会让锅里的水变热,青蛙不能在水温高的环境里生存。另外,要和朋友聊聊,和在锅里的朋友聊聊,感觉异常了,相互帮助能想个办法;你在锅里,朋友在河里,聊一聊各自的环境,你能帮朋友度过寒冬,朋友能帮你认识到燃烧的柴火。突破边界,找到跳出锅的方法,水冷的时候你能有地方保暖,水热的时候能很快跳出锅的束缚。

人生是一条河吗

在河里游泳,是不是不往前游就会往下沉?其实也不会,只要你会踩水,你就能一直浮着,呼气、吸气。如果你沉到了水底,你一直往下沉,你只有在自己还有气之前把自己浮出水面。

通过完成挑战来学习新知识

交通信号灯

陌生的技术

最近在一直在做pythonchallenge这个网站提供的python挑战,以一种使用使用编程来根据线索找到答案的游戏,这个挑战涉及到python技术的方方面面,包括字符串处理,正则表达式,字符串编码解码,加密解密技术,压缩解压缩,http网络技术,图像处理,音频文件处理,算法, 甚至有一道题让我使用代码走出一个复杂的迷宫。在做这个挑战之前,我没有想到,我有一天能涉及到图像处理的技术,但到现在,我对一般的python操作已经熟练掌握,能很容易的读取读片像素点,甚至能通过编程来画出新图片。

发生了什么

面对一道题,玩家首先想到的是这道题我要使用python的哪个库,找到一个新的库,再也不会像以前一样想要把这个库的方方面面都了解清楚,而是以解决一个实际的问题为出发点,这个时候的思路也是清晰的,安装这个库,快速找到能跑起来的代码,不断的尝试不同的技术点,尝试,不断尝试,直到将问题解决。

spring-framework研究

贝多芬

Gradle Spring构建工具

Groovy 入门

Apache Groovy is a dynamic programming language for the Java platform.

Groovy是一个基于jvm的动态编程语言,gradle构建工具使用groovy作为构建配置文件,而不再是xml文件。

安装Groovy
1.下载二进制文件
2.设置环境变量GROOVY_HOME,将GROOVY_HOME/bin添加到PATH
3.执行groovy -v命令测试安装结果

Gradle中如何使用Grovvy

以spring-framework中的build.gradle为例讲解Gradle的语法

spring-framework项目对于gradle的使用

Spring研究过程中出现的版本控制问题

从spring-framework远程仓库fork了代码到自己的仓库之后,我如何同步spring-framework的远程更新?

1.列出当前配置的所有远程仓库

1
git remote -v

2.增加上游

1
git remote add upstream https://github.com/spring-projects/spring-framework.git

3.测试上游增加结果

1
git remote -v

4.选择要更新的分支

1
git checkout master

5.从上游更新代码

1
2
git fetch upstream
git merge upstream/master

6.同步到自己的github仓库

1
git push

dubbo研究

黄山
今天在研究dubbo源码的时候,发现了dubbo的主要贡献者梁飞的个人博客,甚是喜欢,博客里面的俄罗斯方块代码158K,下载下来直接就能跑,很讲究。

开源项目dubbo的组成

dubbo的测试

从测试入手,研究庞大的框架。
dubbo使用的测试相关的依赖:

  • junit 4.12
  • easymock 3.4
  • jmockit 1.33

travis-ci入门

1、 授权github账号
2、 登录travis-ci仓库管理 开启你要持续集成的仓库
3、 在仓库根目录创建.travis.yml文件,文件内容以dubbo为例,其中字母区分大小写,更多构建配置

1
2
3
4
5
6
language: java
jdk:
- oraclejdk8
- openjdk7

script: mvn -DskipTests=true clean package

4、 每一次向github push代码时触发一次构建
5、 点击travis-cli右上角仓库构建状态图标,获取markdown格式的图片链接,并写到自己仓库的README.md中,便能看到构建状态的图标了,而且图标会根据构建状态动态变化。

对于telnet的支持

dubbo支持的telnet功能

内心的声音

马路

内心的声音

开心是什么,是困了可以睡觉,是安全,是饿了有吃的,是能得到自己想要的东西,是获得成就感。内心的声音,是做自己喜欢做的事情,不做自己不喜欢的事情,说自己想说的话,不说自己不想说的话,不违心捧别人的场,交聊的来的朋友,毫不理睬自己不对付的人。

孟德尔的豌豆

雪人

为什么孟德尔会选择豌豆作为实验材料

他选用豌豆为实验材料,是因豌豆的某些特性常有两两成对的情形,且易区分,如高茎和矮茎、种子有圆的和皱的;同事豌豆易于栽培,生长期短,播种后约三个月便开花结果;此外其易于杂交且杂交后结实率高产生的种子仍有生殖力。更重要的是孟德尔知道豌豆为自花受粉,可从事人工受粉的试验。

为什么孟德尔会用统计学的方式去研究豌豆?

从1851年到1853年,孟德尔在维也纳大学学习了4个学期,系统学习了植物学、动物学、物理学和化学等课程。与此同时,他还受到了从事科学研究的良好训练,这些都为他后来从事植物杂交的科学研究奠定了坚实的理论基础

有所发现后他做了什么?

孟德尔的研究支持了遗传的颗粒说,他并且把研究结果送给提出颗粒说的耐格里。

富兰克林

富兰克林

说一说

刚刚是1月15日星期五,这里是一天一个想法的第26期,首先我想说一下,我是如何思考的,这个问题。我写没周的文章是有这样一个模式的,每当我有一个想法,一个灵感的时候,我就会把这个想法记录到我的笔记中去,记下一句话描述这个想法,然后当我周五的时候就统一的去看我一周的想法的记录,然后把这些想法实现成一篇文章,这样。除了这个模式,当我一个人在外面绕圈的时候,我还有一种自己指引思考方向的方法,这时候我脑子里是头绪很多的时候,或者我大脑一片空白的时候,我会用一个方法,我就告诉自己听一听自己内心的声音,想一想自己想要的时候,自己的优势是什么,自己是不是在做一件有趣的事情,自己的头在想什么,我的身体是感觉很精力充沛的,或者是感觉到疲劳了,我是开心的或者是难受的,神奇的就是每当我更深入的感受自己的想法、自己的感受、自己的状态的时候,我要想的问题就会都变得特别的清楚……
接下来是本周我翻过的一些书,和我想说的话。

富兰克林自传

夏天的时候看了一部分的富兰克林自传,动机是寻找一些问题的答案,比如一个有趣的问题,富兰克林总是要完成自己每天安排的工作内容,不管再晚也要完成;还有我在阅读的过程中想到的问题,为什么富兰克林能坚持只吃素好几年,对于我要是菜里面没有肉就会胃口不好,他当时决定吃素的时候是怎么想的。答案也许需要我思考好久才能想明白。这周在读这本书的时候,书中有一段话,我把它摘抄下来贴在了我办公室的电脑上,如下和大家分享。

因为我一直认为:一个有能力的人,只要他有周密的计划,不浪费时间,集中精力在所研究的事业上,他一定能建功立业。

刀背藏身-师父

我买的《刀背藏身》的纸质书,纸质书相比电子书就有很明显的一个特点,就是书的装帧,《刀背藏身》这本书装帧给我的感觉就是很精致,《刀背藏身》是徐皓峰的武侠短片集,243页的书中分为6篇短片小说,其中《师父》这一篇只有50页,我买这本就是因为看了《师父》这部电影。短短50页的书却是包含了能拍摄成一部精彩电影的内容,说明一个问题,书中作者惜字如金,一方面简练,一方面要表达什么意思就开门见山,不绕弯子。再说回到书的装帧,书是比一般的书要长的,书中每一篇短篇的名字专门有一页,这一页是用的区别于内容页的纸黄色的橙红色,书的第一页是一张透明纸粘了一些丝,书的第二页粘了一张箭士柳白猿的小卡片,给我的感觉就是很精致。