透过 Linux 内核看无锁编程

  categories:资料  author:

非阻塞型同步 (Non-blocking Synchronization) 简介

如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步。同步可分为阻塞型同步(Blocking Synchronization)和非阻塞型同步( Non-blocking Synchronization)。

阻 塞型同步是指当一个线程到达临界区时,因另外一个线程已经持有访问该共享数据的锁,从而不能获取锁资源而阻塞,直到另外一个线程释放锁。常见的同步原语有 mutex、semaphore 等。如果同步方案采用不当,就会造成死锁(deadlock),活锁(livelock)和优先级反转(priority inversion),以及效率低下等现象。

为了降低风险程度和提高程序运行效率,业界提出了不采用锁的同步方案,依照这种设计思路设计的算法称为非阻塞型算法,其本质特征就是停止一个线程的执行不会阻碍系统中其他执行实体的运行。

当今比较流行的 Non-blocking Synchronization 实现方案有三种:

  1. Wait-freeWait-free 是指任意线程的任何操作都可以在有限步之内结束,而不用关心其它线程的执行速度。 Wait-free 是基于 per-thread 的,可以认为是 starvation-free 的。非常遗憾的是实际情况并非如此,采用 Wait-free 的程序并不能保证 starvation-free,同时内存消耗也随线程数量而线性增长。目前只有极少数的非阻塞算法实现了这一点。
  2. Lock-freeLock-Free
阅读全文

java并发库中AQS的原理浅析

  categories:java资料  author:

来源:http://ifeve.com/java-special-troops-aqs/

AQS的全称为(AbstractQueuedSynchronizer),这个类也是在java.util.concurrent.locks下 面。这个类似乎很不容易看懂,因为它仅仅是提供了一系列公共的方法,让子类来调用。那么要理解意思,就得从子类下手,反过来看才容易看懂。如下图所示:
aqs-0001

这么多类,我们看那一个?刚刚提到过锁(Lock),我们就从锁开始吧。这里就先以ReentrantLock排它锁为例开始展开讲解如何利用AQS的,然后再简单介绍读写锁的要点(读写锁本身的实现十分复杂,要完全说清楚需要大量的篇幅来说明)。
首先来看看ReentrantLock的构造方法,它的构造方法有两个,如下图所示:
/**
* Creates an instance of {@code ReentrantLock}.
* This is equivalent to using {@code ReentrantLock(false)}.
*/
public ReentrantLock() {
sync = new NonfairSync();
}

/**
* Creates an instance of {@code ReentrantLock} with the… 阅读全文

从0开始学编程(18)–java快速入门

  categories:0基础编程  tags:  author:

Java是一个十分优美的语言,其语言具有面向对象,分布式和多线程等高级计算机语言的特点,同时可移植性,安全性等也受到大家的青睐。

java语言是个非常实用的语言, 使用范围非常广泛, 可以做服务器, 可以做客户端, 还可以放到网页中做小部件(尽管现在用的比较少了)。

可以开发一个java的socket程序进行高性能通讯, 可以做支付系统, 电商系统等等。

java很实用,不是一朝一夕能快速学会的。 我们前面学习了很多php的知识, 有了这些知识做基础, 学习java的各种语法就方便多了, 同时也顺便比较一下java同php的区别。

我们还是提供一套 java的教程, 我还是在网络上找了一套教程, 分享给大家,希望大家喜欢。

链接: http://pan.baidu.com/s/1dD4GJWt 密码: 0ov4

还是, 尽量向后看每一集, 不要因为个别内容看不懂而停下来。 不断的看, 每天进步一点点。

下面是java中的 几个名称,

1. 什么是api

Application Programme Interface→应用程序接口,Java最主要的特点是其面向对象OO→Object Oriented→面向对象。所以设置了很多基础应用程序接口(API),你是不是在你设计程序的时候常用import!?那就是引用API的方法。

2. J2SDK
J2SDK=JDK+JRE,J2SDK(Java 2 Software … 阅读全文

进程与线程的一个简单解释

  categories:资料  author:

本来想找点文章, 写一下,线程的入门的东西, 在网上找到了一篇非好的, 非常清楚的讲解了, 线程,进程的关系的文章, 非常清楚。

原文地址:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html

作者: 阮一峰

日期:2013年4月24日

进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。

最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂。

1.计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。

(现在计算机中都是多核了, 可以简单理解是 多个cpu, 但是本文是更像是讨论单核cpu了)

 

2.假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。

 

3.进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。

 

4.一个车间里,可以有很多工人。他们协同完成一个任务。

 

 

5.线程就好比车间里的工人。一个进程可以包括多个线程。

 

6.车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。

共享内存和线程之间的锁,是多线程的基础(还有不是基于共享内侧和锁的线程并发模型,例如scala的actor, 但是共享内存的线程是前提)

 

7.可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。

 

8.一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫”互斥锁”(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。

 

9.还有些房间,可以同时容纳n个人,比如厨房。也就是说,如果人数大于n,多出来的人只能在外面等着。这好比某些内存区域,只能供给固定数目的线程使用。

 … 阅读全文

Android官方图片加载利器BitmapFun解析

  categories:android资料  author:
来源:http://www.cnblogs.com/purediy/p/3462822.html

通过BitmapFun在项目中使用,结合代码了解一下BitmapFun加载图片的原理,以及最佳使用实践。本文说明不包括BitmapFun的缓存部分。

Android开发在使用ListView和 GridView时,可能会有很多网络图片需要加载,通常我们会为每个图片加载启动一个Thread或者直接使用官方提供的AsyncTask,来做 Http异步加载,但当每个ImageView子视图都触发一个AsyncTask来异步加载图片时,这样就会产生如下问题:

1. 当用户快速滑动时,ImageView已经被回收,而绑定的线程还在运行,浪费CPU,浪费内存。

2. 无法确保当前视图在结束时,分配的视图已经进入循环队列中给另外一个子视图进行重用,意思就是,图片显示错位了,不该显示到当前问题的图片却显示了,这个 是经常遇到的问题。可以结合Adapter中的getView方法的convertView参数理解,ListView是回收和重复利用item的。

3. 无法确保所有的异步任务能够按顺序执行。

在这些问题下,官网给出的答案是,使用下面的方法来保证:

1. ImageView和Task绑定准确的加载对应图片;

2. ImageView和Task无法对应时则取消任务;

BitmapFun实现多线程并发加载图片的原理:

一个类,两个方法:

class AsyncDrawable extends BitmapDrawable{…}

boolean cancelPotentialWork(String url, ImageView imageView){…}

ImageViewResizeTask getBitmapWorkerTask(ImageView imageView){…}

具体代码实现如下:

/**
* 扩展BitmapDrawable类,通过弱引用关联任务BitmapWorkerTask
* BitmapDrawable被用来作为占位图片,绑定任务到ImageView中
*/
private class

阅读全文

Linux中为Tomcat启用软链接的三种方式

  categories:资料  tags:  author:

本文介绍下,在linux下为tomcat启动软链接的三种方法,有需要的朋友参考下,希望对大家有所帮助。

Liunx上的软链接又叫符号链接,这个文件包含了另一个文件的路径名。
可以是任意文件或目录,可以链接不同文件系统的文件。

链接文件甚至可以链接不存在的文件,这就产生一般称之为”断链”的现象,链接文件甚至可以循环链接自己。类似于编程语言中的递归。

软链接文件只是其源文件的一个标记,当删除了源文件后,链接文件不能独立存在,虽然仍保留文件名,但却不能查看软链接文件的内容了。

说明:
Tomcat默认情况是不允许软链接的,因此当通过命令行设置软链接后,通过URL访问得到404错误。

介绍三种解决方式(均以项目yourApp为例):

一、在项目的META-INF目录中增加context.xml文件

<?xml version=”1.0″ encoding=”UTF-8″?>
<Context path=”/yourApp” allowLinking=”true”>
</Context>

二、在Tomcat的/conf/Catalina/localhost/目录下增加名字为项目名的XML配置文件。
创建yourApp.xml文件,文件内容和第一种的文件内容一致,唯一区别在于文件名的不同。

三、直接在tomcat的配置目录conf/的context.xml文件中增加如下属性
在<Context/>标签里面增加:
allowLinking=”true”… 阅读全文

如何使用Android MediaStore裁剪大图片

  categories:android资料  author:

来源:http://blog.csdn.net/floodingfire/article/details/8144587

译者:Ryan Hoo

来源:http://www.androidworks.com/crop_large_photos_with_android

译者按:在外企工作的半年多中花了不少时间在国外的网站上搜寻资料,其中有一些相当有含金量的文章,我会陆陆续续翻译成中文,与大家共享之。初次翻译,“信达雅”三境界恐怕只到信的层次,望大家见谅!

这篇文章相当经典而实用,想当初我做手机拍照截图的时候,大多都是在网上抄来抄去的内容,从来没有人考虑过实际项目中的需求。实际上,拍照传大图片,如果 用普通方式会耗用极大的内存,Android一个App原则上的16M内存限制可以一下子被耗光。Android在拍照上有一个隐藏的设计,如果拍照图片 过大,只返回一张缩略图。具体到不同手机,都是不一样的。

译文:

概述
我写这篇文章是为了发表我对MediaStore裁剪图片功能的一些简要研究。基本上,如果你要写一个应用程序,使用已有的Media Gallery并允许用户在你的应用里选取TA的图片的一部分(可选功能:人脸识别)。 可以使用一个Intent做到这个,但是也存在着相应的问题,总的来说也缺少这方面的文档告诉我们怎么实现它。 另外,这篇文章基于2.1并且在Nexus One上做了测试。 Nexus One上的实现似乎被这群人写在了这里: Media Gellery for Nexus One 。

反馈

这篇文章需要使用基于我的研究所写的程序。如果你对我推荐的实现方案有所改进,请让我知道。我会相应的更新这篇文章。

Intent细节
首先,让我们探讨下Intent以及它的特点。在看了一些代码示例以后,我发现我可以很轻松的使用如下的Intent调用裁剪功能:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType(“image/*”);
intent.putExtra(“crop”, “true”);

然而,这是在我缺少附加的文档,不知道这些选项的具体含义等等情况之下的选择。所以,我将我的yanj整理成一个表格 ,并写了一个演示程序,力图演示控制此功能的所有可供选项。
你可以在你的程序中使用使用我的代码,并且扩展它。我会将之附加在这篇文章上。… 阅读全文

Android横竖屏切换总结

  categories:android资料  author:

Android横竖屏要解决的问题应该就两个:

一.布局问题

二.重新载入问题

1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation属性,他有以下几个参数:

“unspecified”:默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.
“landscape”:横屏显示(宽比高要长)
“portrait”:竖屏显示(高比宽要长)
“user”:用户当前首选的方向
“behind”:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
“sensor”:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。
“nosensor”:忽略物理感应器,这样就不会随着用户旋转设备而更改了(”unspecified”设置除外)。

也可以在Java代码中通过setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)来设置。

如果要让软件在横竖屏之间切换,由于横竖屏的高宽会发生转换,有可能会要求不同的布局。可以通过以下方法来切换布局:

1)在res目录下建立layout-land和layout-port目录,相应的layout文件不变,比如main.xml。layout-land是横屏的layout,layout-port是竖屏的layout,其他的不用管,模拟器会自动寻找。
2) 通过 this.getResources().getConfiguration().orientation来判断当前是横屏还是竖屏然后来加载相应的 xml布局文件。因为当屏幕变为横屏的时候,系统会重新呼叫当前Activity的onCreate方法,你可以把以下方法放在你的onCreate中来 检查当前的方向,然后可以让你的setContentView来载入不同的layout xml.
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
Log.i(“info”,”landscape”); // 横屏
}
else if(this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT) {
Log.i(“info”,”portrait”); // 竖屏
}
在onConfigurationChanged()方法中也可以检测拥有硬键盘的键盘状态
//检测实体键盘的状态:推出或者合上 &nbsp;&nbsp;… 阅读全文

kafka java示例

  categories:mq, 资料  tags:, ,   author:

研究kafka中, 集群批准好了, 用kafka的 控制台例子收发消息都成功了, 想用java进行一下测试,但是怎么弄都没好用, 在网络搜索了例子测试一下。

kafka官方给的示例并不是很完整,以下代码是经过我补充的并且编译后能运行的。
http://kafka.apache.org/documentation.html#highlevelconsumerapi 等

Producer Code

import java.util.*;
import kafka.message.Message;
import kafka.producer.ProducerConfig;
import kafka.javaapi.producer.Producer;
import kafka.javaapi.producer.ProducerData;

public class ProducerSample {

public static void main(String[] args) {
ProducerSample ps = new ProducerSample();

Properties props = new … 阅读全文




快乐成长 每天进步一点点      京ICP备18032580号-1