Java并发框架(java.util.concurrent.*)扫盲

March 8th, 2010

    在多核时代,为了提高CPU的使用率同时提高程序的运行效率,并发编程成为一种趋势。JDK1.5(2004-10发布)加入并发包已经过去了5个年头了,很多java程序员对并发编程仍然一无所知;尤其是在简历上写着精通JAVA的同学们,当我问juc包的使用情况的时候,他们否定使用过,我对他们的看法也就直接减分了。以前在看《Java 并发编程实践》这边书的时候做过相关API的总结,拿出来扫盲了。

    并发包中的API一览

    执行框程序(Executor):最常见的用法就是用Executors来构造相关的线程池;用CompletionService来分离生产任务和已经完成的任务,生产者 submit 执行的任务。使用者 take 已完成的任务,并按照完成这些任务的顺序处理它们的结果;Callable和Future接口到处都需要用到。

    队列(Queue):在使用生产者消费者模式的时候需要构建出满足自己自身系统需要的队列。

    同步器(Synchronizer)常见的有5种:

  1. 信号量(Semaphore)用于限制可以访问某些资源(物理的或逻辑的)的线程数目;
  2. 闭锁(CountDownLatch)是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用于在保持给定数目的 信号、事件或条件前阻塞执行。把信号量设置为1的时候就是一个闭锁的实现。
  3. 关卡(CyclicBarrier)允许一个给定数量的成员多次集中在一个关卡点,然后在统一执行后面的操作,这在并行迭代算法中非常有用,能把一个问题拆分成一系列相互独立的子问题。
  4. 交换器(Exchanger)是关卡的另一种形式,它提供了一个同步点,在这个同步点,一对线程可以交换数据。每个线程通过exchange()方法的入口提供数据给他的伙伴线程,并接收他的伙伴线程提供的数据,并返回。它在多流水线设计中是有用的。
  5. Future和FutureTask:可取消的异步计算,利用开始和取消计算的方法、查询计算是否完成的方法和获取计算结果的方法。FutureTask可以通过线程池来执行。

    并发容器:ConcurrentHashMap来获取的完全并发和更新的所期望可调整并发的哈希表;期望的读数和遍历远远大于列表的更新数时,请使用CopyOnWriteArrayList 代替 ArrayList。

    原子操作(atomic):支持在单个变量上解除锁的线程安全编程;我用的最多的是在多线程中的计数操作。

    互斥锁(Lock):为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器,该框架允许更灵活地使用锁和条件。

    Amdahl定律

    Amdahl定律描述了在一个系统中,基于可并行化和串行化的组件各自所占的比重,程序通过获得额外的计算资源,理论上能够加速多少。如果F是必须串行化执行的比重,那么Amdahl定律告诉我们,在一个N处理器的机器中,我们最多可以加速:1/(F+(1-F)/N)
    当N无限增大趋近无穷时,speedup的最大值无限趋近1/F,这意味着一个程序中如果50%的处理都需要串行进行的话,speedup只能提升2倍(不考虑事实上有多少线程可用);如果程序的10%需要串行进行,speedup最多能够提高近10倍。更多信息点击这里

    Spring中的多线程任务

    在中小型项目中把一些提醒类邮件(邮件发送等级较低)放到spring线程池内执行,可以减少邮件发送等待时间。前提是:这些邮件的发送不需要放到数据库或者是文件系统中持久化。在邮件发送类中引用:TaskExecutor接口来执行邮件发送的线程,spring的配置使用示例:

<bean id="emailExecutor"
        class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <property name="corePoolSize" value="6" />
        <property name="maxPoolSize" value="10" />
        <property name="queueCapacity" value="80" />
        <property name="rejectedExecutionHandler">
            <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
        </property>
</bean>

    书籍推荐    点击这里查看IBM developerworks的多线程专题

                      

 

longhao Java , , , , , , , ,

杭州程序员圆桌会议第一期–Java并发编程

March 2nd, 2010

杭州程序员圆桌会议第一期–Java并发编程 活动预告: 点击这里报名或者邮件longtask#gmail.com报名

  • 时间:2010-3-20 14:15 — 17:15
  • 地点:杭州 BetaCafe
  • 内容:Java并发编程实践探讨
  • 要求:非在校学生需要并发编程经验
  • 消费:AA制,支付宝付款

    以往聚会体会

    年前和伯岩小 聚,讨论了一些网事和程事(程序相关的事情),交谈很投机。其中我俩都提到了参加相关程序员聚会的问题,前提是如果有人组织,我们都会抽时间参见。翻看豆 瓣和口碑网上的活动,和程事相关的活动凤毛麟角,大家似乎都在组织休闲类的活动,对技术类的活动,只有一些公司会组织。

    在深圳的时候,参加过blog聚会,推友聚会,长三角技术聚会……其中这些活动很好的提升了我的视野,认识了一帮朋友。在参加第一次长三角技术聚会的时候,听杨老师讲Key-Value数据库感触很深,回来看了amazon dynamogoogle mapreduce bigtable gfs的论文,虽然很多地方现在仍然不理解,但是了解一些前沿的技术还是很有必要的。当我为这些好的活动欣喜若狂的时候,也发现了一个问题:这些聚会对我实际工作中如何写出高质量的代码似乎帮助不大!

    思考:活动如何提高人的动手能力

    首先想到的是培训。通过交钱参加一些培训来提升动手能力,这个或许是一个捷径,否则新东方也不会这么火。如果你做了3年以上的java开发,什么样的培训比较适合你呢?而且培训费用动辄就是上万,培训的质量也不一定高。以前参加的培训,老师也基本是在教程序员如何高瞻远瞩,内容大众化,缺少应用的针对性。当然有些培训师实践经验相当丰富,不过只有公司才可以请得起,个人付费参加相关的培训有点天方夜谭了。修行还是需要靠个人。

    过年回来杭州的火车上碰到一个搞学术的硕士,我请教了一个问题:如何更好的读论文。他告诉我:最好是几个人一起读,然后交流总结,这样见成效比较快!结合一下以前我的学习经验,这个建议还是很靠谱的。对待同一个论文,或许有人善于总结,有人善于发现问题,有人善于理论结合实践……每个人看的角度不一样,效果也就迥异。大家合计交流一下,就能很好的吸收论文的内容。写代码又何尝不是如此!

    既然没人组织小规模程序员技术交流的线下活动,我何不尝试一次?

    想法:程序员圆桌会议

    从亚瑟王的圆桌骑士的故事中得到启示,程序员的聚会的目标是提高动手能力,所以还是对聚会成员有点要求的:至少对聚会的话题有相关的实践经验,能够说出几条心得。第一次的聚会主题还是简单点比较好,以后逐渐拓展。

    当然在杭州的聚会条件得天独厚,茶馆,咖啡馆林立。选择BetaCafe主要是该店互联网气氛比较好,大家可以被熏陶一下!支付宝也为活动AA制提供了支持。

    联系&&建议

    联系方式:Email:longtask#gmail.com    twitter:hoorace   QQ:552906

   

longhao 互联网络 , ,

windows7的兼容iTunes的问题

February 11th, 2010

    买了ipod nano 5代,总是要使用iTunes来同步一些东西,可是在再见的windows7上安装iTunes后,发现启动后死机,尝试了苹果官方上讲述的方法(iTunes(Windows XP 版)或 iTunes(Windows 7 版):意外退出、冻结或启动问题的故障诊断)来解决这个问题,缺未能达到预期的效果,在我的笔记本上仍然不能使用。这个情况和我在windows 7上安装Skype是一样的。

    然后在网上到处搜寻解决之道,结果一再的让我失望,机器也被硬重启了N次。后来找了个xp系统的计算机,竟然啥问题都没有,所有的东西都按照预期效果完美的同步成功。不能不感叹一下,软件的成熟周期内,不仅用户痛苦,软件提供商,系统提供商都同样的抑郁。

    或许是T400 pv7的问题;或许是windows7的问题;或许是我计算机上软件的问题;或许是要过年了,计算机闹罢工……不过还是建议大家谨慎的选择安装windows7!

longhao 生活 , ,

一个淘宝网店的用户体验

January 27th, 2010
     过年回家准备给老爸买件衣服,结果在淘宝上溜达了一圈发现模特都是男青年,似乎衣服都不是我老爸那个年龄段的,大失所望!在多家淘宝店中闲逛一圈后,发现很多店铺的用户体验都存在同样问题。具体如下:
  •     导航不明晰,或者是下拉后才可以找到导航商品菜单;
  •     部分图片展示不了;
  •     做的太炫,给人一种眼花缭乱的感觉;
  •     过多的没有价值的信息;
  •     页面太长,首页放的内容太多。
    ……
 
    刚好一个朋友的亲人在折腾淘宝店(摩菲),他希望我给他们的店铺的用户体验提一点意见或者建议,其实我是个门外汉,具体怎么做才算是优秀的体验店我也不知道,只能从用户(我)购买的角度来点评一下这个店铺,结合一些道听途说的用户体验的理论,本着让我自己看起来舒服和最快的速度找到想要商品的原则,来谈谈这个店铺的用户体验。

   看不明白的是做啥的

    在页面的上,似乎闪动的点太多了,店铺标题,一些背景,交替展示的图片,实在找不到重点在哪里,也弄不明白这个店是卖什么的。看到这个页面,我必须动一下鼠标才知道:哦,原来这个店卖羊毛衫;看到最后才知道这个店是专业卖羊毛衫的;看完我还有个疑问,这个店卖女装么?最后找了半天,靠,不卖!
  •     看来副标题是必须的,“摩菲服饰 — 专业羊毛衫男装专卖店”。闲杂人等,非诚勿扰哈!
  •     或许有人会说从域名laogong.taobao.com可以看出来啊?其实,看到这个域名,我还以为是教男人做好老公的店铺。

   到处都是重点的导航

 
    左边导航中,把图片和文字混合起来放的时候,如果图片不是和行等高的话,看起来有点别扭,一种“扒开内裤找屁股”的感觉。导航的清晰度可以直接反映出这个地方有没有我想要的东西,必须让用户有种“扒开屁股找内裤”的感觉。如果是在导航的后面加上一个文字gif图片提醒用户的话或许会有更好的效果出来,不要给人一种导航到处都是重点的感觉
  •     在导航上,后面有图片的导航不要超过3个,展示我们推荐的内容。具体推荐的东西可以做成大图片放在右端最上面,不能和导航混合在一起。

   几乎没有价值的搜索

 
 
    目前这个店的商品比较单一,但是搜索却放在最显眼的位置,或许是店铺的主人习惯了搜索引擎,追求一下时尚。我们尝试搜索一下:“上衣”,价格区间100-300。结果为:无!可是它明明是卖羊毛衫上衣的店铺。其实在搜索中区分圆领或者是提花并没有实际的价值,我是不习惯在搜索中这样区分的,因为我习惯导航点击。
  •     建议在最上面放促销信息,鉴于目前商品较为单一,去掉没有价值的搜索。
  •     在自己的商品信息量比较大的时候,导航无法搞定分类细节,搜索就成了必需品,那个时候再放也不迟。

   谁能告诉我?

    1:核心位置下面的那个链接都没有的banner是做什么的?
    2:我想作为你们的代理商,你们的客服都不在线或者是我没有旺旺账号怎么办?
    3:“秒杀+换购”是不是只能秒杀才能换购?
 
    暂时不忍心给这个店打分,毕竟店铺的用户体验是逐步提高的,普通人开店都是看到别人怎么整自己都怎么做,追求:炫丽,内容多,排版满,该放的都放上。或许提高一个店铺的用户体验和提高一个人的品质是一样的:清晰!去掉页面的噪点,简单的去突出重点,或许效果会更好。
    最后申明:这不是软文,仅仅想提高一下自己的分析能力而已。

longhao 电子商务

ubuntu9.10 启动失败的问题修复(wubi安装)

January 14th, 2010

        在自己的主机上用wubi安装了个ubuntu9.10的版本,第一次装了显卡的驱动启动不了,然后重装了,第二次死机导 致启动不了,重装了,第三次装xen后启动不了,上面安装的东西太多了,不能重装了。所以需要找一个方法来解决这个问题。通过看其他人计算机上的 /boot/grub/grub.cfg的配置文件来手动启动一下unbutu

  1. grub>ls                         #查看各个盘符,我的ubuntu安装在G盘
  2. grub>ls (hd0,8)/             #找出wubi安装的盘,里面有ubuntu/这个目录。
  3. grub>insmod ntfs           #加载ntfs模块,因为wubi将ubuntu安装到了我分的ntfs盘上
  4. grub>set root=(hd0,8)    #这里(hd0,8)就是我找到的ubuntu安装的分区
  5. grub>ls $Boot                   #找到我们BOOT分区的UUID,下一步要用到,我这里显示出来的是2bfdd717c2a56da9   
  6. grub>search –no-floppy –fs-uuid –set 2bfdd717c2a56da9    #这里的UUID就是上一定找出来的那个
  7. grub>loopback loop0 /ubuntu/disks/root.disk   #设loop0,wubi装ubuntu安装成了一个root.disk文件
  8. grub>set root=(loop0)       #重设root
    #加载内核 vmlinuz-2.6.31-16-generic ,其实有14,17的选项,试过了,都启动不了。下面的sda8是和前面的盘符数字一致的。
  9. grub>linux /boot/vmlinuzxxxxxxxxx   (tab补全即可) root=/dev/sda8 loop=/ubuntu/disks/root.disk ro quiet splash   
  10. grub>initrd /boot/initrd.imgxxxxxxxxxxxx(tab 补全即可)            #挂载启动镜像文件       
  11. gurb>boot
    很快就可以看到系统启动的界面了,但是下次重启还是继续要输入以上命令,为此只能卸载xen的server了。
    卸载掉xen的方法:sudo apt-get -y remove ubuntu-xen-server,启动linux正常了。

注意:ubuntu9.10目前不支持ati的显卡驱动和xen的运行,周知!如果想很好的运行xen,请用centOS吧(自带安装)!

longhao 生活 , , ,

被云计算和被“云”化

January 13th, 2010

       云计算应该是2009年炒作最火的IT概念,不仅各大厂商争相跟进,更有些“散户”也参与到炒作之中,七彩云笼罩在IT人的头上,由于需要研究云计算,后续或许会写很多关于云计算的博文,还是开个头来谈谈云计算。

云计算的产生(问题驱动型)

    
    云计算的代表性企业有3家:Salesforce.com;amazonaws.com;appengine.google.com。他们都是遇到了不同的问题,在解决不同问题的过程中,统一到了一个概念:云!


    首先谈salesforce:它的CEO贝尼奥夫这个"软件终结者"把SaaS(Software-as-a-service)理念付诸于CRM系统上, 但是SaaS这个概率似乎谁都可以炒作,一个20人的小公司都可以说他们是SaaS的公司。salesforce为了说明自己和这类小字辈的差别,加上自 己的一点分布式计算和分布式存储的基础,号称自己是云计算提供商了。由于云计算是从SaaS演进来的,所以不得不提这家公司。


    其次谈amazon:2003年,amazon的某员工发现他们遇到访问量猛增的时候,不断的加机器,而后加上的机器很长一段时间处于低使用率状态,为了 达到70-75%的计算机CPU使用率,他们把一部分资源作为虚拟机的形式租借给没有分布式服务中心的用户,让他们可以在amazon的集群上做自己想做 的事情。从amazonaws.com的域名上来看,amazon其实后续希望在虚拟主机的基础上提供web service服务。amazon提供的服务很好的满足了中小用户的分布式计算和分布式存储的服务,某种意义上说是云计算的典范,可惜它不是云计算的提出 者。


    最后谈google:他们在大的集群(以gfs,mapreduce,bigtable基础)上专门做某方面的应用,处理能力提升了很多,2006 年,google内部把这种集群称之为“云”。当时他们碰到一个问题:如果提高大集群的能力,让它能够超过任何小集群的能力。高级软件工程师克里斯托夫· 比希利亚开启了“google 101”计划,让高校的学生参与到云的开发中,后来就演变为了google appengine,不过这是google的小云,更大的云是google的全面的服务:gmail,google docs等。有了google的云,你可以在网上做日常的任何事情。


    后来,云计算这个概念引起了硬件厂商的兴趣,这样太好了,你们炒作概念,我们顶一下,然后大规模的卖硬件。所以才有了今天的天下一片“云”的现象。


用户受到云计算的哪些诱惑


    (1)省钱:按需购买计算的资源的确是很好的注意,这样可以很好的提高服务器的使用率,节省硬件和网络的开销。不用的时候则停止租用,节约使用开支。
    (2)易拓展:随时购买新的服务,得到新的资源。
    (3)易开发:在提供的web service的服务的基础上开发应用程序比自己搭建环境要快了很多。
    在节省了硬件成本和软件成本的基础上,很多企业都投入到云的怀抱中,目前投入amazon 云计算怀抱的有以下企业:
    twitter,slideshare,Time……


我理解的云计算组成部分


    (1)硬件服务:虚拟机。通过web的方式租用虚拟机资源,按照自己的需求在虚拟机上跑相关的应用,在处理完相关的业务后,停止租用即可。amazon在这方面拥有优势。
    (2)软件服务:webservice。通过提供webservice来让用户在云计算提供商的集群上实现自己的需求。google在这方面拥有优势。
    所谓的分布式存储(magicFS,key-value database)和分布式计算(hadoop)都是可以站在巨人的肩上完成的事情。

被云计算的中国

    中国的云计算跟进者们,并不是效仿amazon和google来解决系统的问题,提高系统资源的利用率,大部分都是炒作概念,给硬件厂商送钱去了。
    (1)移动服务商中国移动的云计算,其实就是一个用hadoop搭建的分布式系统,目前还是科研阶段,有1024个cpu和256个节点,号称是为了提升内部高性能计算需求,其实就是跟进炒作,或许还是为了提升某些人的KPI,这些机器用来实验,硬件厂商开始笑了。
    (2)互联网企业sina的云计算就是一个webservice而已,和google的有些类似。提供php的语言支持和mysql的数据库支持。没有任何迹象表明sina的云平台和自己的什么服务有关联性,完全是为了云计算而云计算。
    (3)地方政府:不谈了,就是把纳税人的钱扔给国外的巨头,没有技术人员搞什么云计算?完全是在开玩笑!例如:华南首个云计算落户佛山
    (4)小企业参与炒作:戴尔和语音服务提供商讯鸟结成联盟来提供云计算服务,我靠,这真是个云计算上的笑话。修改为“云呼叫”或许更靠谱
    在国内,都是为了云计算而云计算了,看似跟随了时代的潮流,却没有给把服务质量提高到一个层次。没有技术,只能被云计算玩。所以目前在中国没有云计算的厂商,只有被云计算的厂商。


被“云”化


    这方面:杀毒软件提供商瑞星和360安全卫士走到了前列,前者提出了“云安全”,后者也结合自身优势提出了“云木马查杀”。一直没有搞明白,我的软件为什么还在升级,而且还在本机上有继续的安装。没有以服务的姿态提供出来,“云”化是不是太早了?


人人都来云计算
    我家有3台电脑,符合搭建linux集群的条件,想玩一下云计算,有么高招?当然,有开源的云计算软件帮你完成心愿。接触开源软件能够更快的帮你了解云计算。

    (1) Eucalyptus 项目(Elastic Utility Computing Architecture for Linking Your Programs To Useful Systems)是Amazon EC2 的一个开源实现,它与商业服务接口兼容。和EC2 一样,Eucalyptus 依赖于Linux 和Xen 进行操作系统虚拟化。Eucalyptus 是加利福尼亚大学(Santa Barbara)为进行云计算研究而开发的。您可以从该大学的网站上下载它,或者通过 Eucalyptus Public Cloud 体验它,不过后者有一些限制。

    (2) Enomalism 云计算平台。Enomalism 是一个开放源代码项目,它提供了一个功能类似于 EC2 的云计算框架。Enomalism 基于 Linux,同时支持 Xen 和 Kernel Virtual Machine(KVM)。Enomalism 提供了一个基于 TurboGears Web 应用程序框架和 Python 的软件栈。

      到最后还是很难给云计算下个定义,炒作者太多了,眼花缭乱,期待google出来给一个定义。

longhao 互联网络 , , , , , ,