Java中monitor的同步设计

CS4231 – 第二次作业中Java中monitor的一些笔记

这学期跑到NUS来一不小心就选了一门难度极大的课,这第二次的作业做了半天只做对了一道题。。看了答案之后,仿佛懂了些什么,在这里大致记录下,到时候期中期末考试以便能够救自己一命。

对于monitor的设计的基本思路

Java中的每一个对象都是一个 monitor,每一个monitor都拥有着两个队列。其中一个队列是由操作系统或者说CPU进行上下文切换时使用的,另一个队列就是我们将会使用到的Wait-Notify对中使用的队列。这个队列大致来说是一个BlockingQueue,也就是会将当前的thread放入到这个队列中进行阻塞,直到notify唤醒为止。下面是设计的时候的大致思路。

  1. 首先需要确定当前的monitor,后面两个条件中的某一个满足可以考虑(个人理解):当前的synchronized区里面monitor是你想要保证的一次只能有一个线程访问的shared variable或者/并且该对象将会成为一个被阻塞的对象;

  2. 设计的时候一定要有代入感的把每一个线程操作想清楚,每一步都应该有一个比较现实、能够理解的意义。

weiter lesen

Java8的一些新特性

初探Java8的一些“新”特性

随着Java9的发布,我愈加地感觉连这个Java8的最重要的新特性都没摸清楚的我越来越面临被淘汰的危险。为了避免这样的境地,我速度入门了一波Java的Stream API,大致作为Java8的一些“新”特性的最初的一点点探索。

lambda表达式到底是什么

lambda表达式又被人们称作匿名函数,它是一个只有一行(?)的没有名字的函数。一个普通的函数拥有了返回值、命名、参数以及代码块四个部分,然而lambda表达式省略了其中的前两个。其基本语法如下所示:

1
(args) -> {codes}

上面中的两个括号都是可以省略掉的。这东西就是所谓的lambda表达式,然而我们今天要提到的当然不只是这一点点。

weiter lesen

PAC2017小经历(二)

PAC2017小经历(二)

前一段时间沉迷于各种实验、报告(以及塞尔达),现在终于有了时间想起来这个博客就这样烂尾了。。现在赶紧在残存的记忆中再写一些东西上去。。

向量化(Vectorization)

KNL平台的CPU支持AVX-512的向量操作,也就是说对于它来说,可以同时操作8*8个double数的运算。这样的操作显然是并行运算中所需要的,于是在这次比赛中,我们便试着对程序进行了向量化改写。这个改写阶段大致分为两个部分:失败、低效的手动改写以及莫名其妙很厉害的自动向量化(就是加了一个参数)。

weiter lesen

PAC2017小经历(一)

PAC2017小经历(一)

经过了半年的学习之后,菜鸡在大腿的协助下参加了PAC2017的决赛。负责做第一道comcot海啸预测模型的优化问题(跟之前的比赛迷之相似,然而完全不同)。最后做出来效果好像还不错,在缺少了一个关键编译选项的情况下,速度提高了27.7倍(自然,大腿的功劳更大)。在这里大致写一些学到的东西,以防以后再次掉坑。

KNL平台

KNL的结构图

KNL架构的CPU菜鸡我也不能说的很清楚,丢下一个链接:http://blog.throneclay.com/2016/08/20/knl_mcdram/。其中几个比较重要的,对优化有帮助的是核心数、内存模式以及支持AVX-512的指令集,不过我们当时好像只有68个核心可以用(而且说好的超线程我们试了半天也没超起来)。

weiter lesen

神威·太湖之光初体验

神威·太湖之光初体验

在ASC17的比赛中,本菜鸡负责了MASNUM这样一个从上世纪90年代就开始发展的海浪模拟应用的在神威·太湖之光上的优化任务(虽然最后并没能在要求时间内跑完最后一个workload。。账号一开始被赛委会删了可能也是一个原因(?!!)。。),并且借此机会也尝试了一下神威的速度,同时踩了上面的许许多多的坑。

神威的结构

神威的结构图

神威采用的是完全国产的SW26010处理器,其中每一个处理器有四个核组(CGs),这些核组之间是通过一个芯片上的网络互相连接的。每一个CG包含了一个内存管理器(MC)、消息处理核心(MPE)、计算处理核心集群(CPEs)。其中MPE支持完整的中断功能,内存管理,超标量和乱序问题/执行,擅长处理管理,任务进度和数据通信,而CPEs旨在最大限度地提高聚合计算吞吐量,同时最小化微架构的复杂性。相对于MPE,CPE不支持中断。

weiter lesen

设计模式——行为模式(一)

Chain Of Responsibility(职责链)

目标

使多个对象都有机会处理请求,避免请求的发送者与接收者之间的耦合关系。将这些接受请求的对象连成一条链,使得请求顺着这条链被传递,直到某一个对象处理了它为止。

结构

结构图

其中Handler都具有着指向自己的后继者的指针,使得请求能够顺着职责链依次向下传递下去。

协作

安卓View的事件分发机制

当Client发送了一个请求给整个职责链之后,该请求将会顺着链条往下一直传递下去,直到某个对象处理了这个请求。(即返回true或者其他)

在安卓系统中,View事件的处理机制便是如此,先在向下发送的时候,通过onInterceptTouchEvent方法来决定事件是否将会顺着职责链向下传递,然后再通过onTouchEvent方法来决定处理之后会不会随着职责链向上继续被处理.

weiter lesen

设计模式——结构型模式(七)

Proxy(代理模式)

目标

为其他对象提供一种代理,以得以控制这个对象的访问。

结构

结构图

Subject作为Proxy与RealSubject的共用接口保证了能使用RealSubject的接口的地方都可以使用Proxy,并且Proxy中保存着一个能够访问到RealSubject的指针。

协作

时序图

Client类在创建一个Proxy对象的同时,Proxy对象也会创建一个RealSubject实例。当Client发出一个请求之后,Proxy对象会在处理了preRequest之后调用RealSubject的request方法,最后再调用afterRequest方法。

weiter lesen

设计模式——结构型模式(六)

Flyweight(享元模式)

目标

使用共享技术有效地支持大量细粒度的对象。

结构

结构图

享元接口由享元工厂生产出来,其中包含着可被共享的享元与不可共享的享元。当用户需要一个享元对象的时候,享元工厂将根据情况生产或者返回对象。

协作

时序图

用户通过调用享元工厂以得到相应的享元对象,这个对象将会根据是否是一个可被共享的享元对象让工厂对其能不能作为一个享元来进行相应的操作。

weiter lesen

设计模式——结构型模式(五)

Facade(外观模式)

目标

为子系统中的一组接口提供一个一致界面,定义一个可以试子系统更加容易使用的高级接口。

结构

结构图

客户在一个统一的高级接口的调用下完成了对完全解耦的子系统的调用,以避免用户对子系统细节的直接参与等。

协作

时序图

Client类通过对Facade接口的创建统一地对子系统下的各文件进行创建,并且在调用一个Facade提供的方法之后,由Facade接口统一地调度进行操作子系统中相应的方法。Client从而不会直接访问子程序。

weiter lesen


Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2018 Alex's Blog All Rights Reserved.

Yifeng Tang hält Urheberrechtsansprüche.