java并发教程
未读长期以来,多线程是访问者中非常受欢迎的话题。虽然我个人觉得很少有人真正有机会从事复杂的多线程应用程序的工作(最近7年我只有一次机会),但仍然可以帮助您方便地使用这些概念,仅能增强您的信心。之前,我讨论了一个有关 wait()和sleep()方法之间差异的类似问题,这一次,我正在讨论 join()和yield()方法之间的差异。坦白地说,我在实践中并未同时使用这两种方法,因此,如果您在任何时候都感到不满意,请提出意见。
A little background on java thread scheduling需要Java虚拟机在其各个线程之间实施基于优先级的抢占式调度程序。这意味着为Java程序中的每个线程分配了一定的优先级,该优先级在明确定义的范围内。开发人员可以更改此优先级。Java虚拟机永远不会更改线程的优先级,即使该线程已经运行了一段时间。
优先级值很重要,因为Java虚拟机与基础操作系统之间的约定是,操作系统通常必须选择以最高优先级运行Java线程。这就是说Java实现基于优先级的调度程序时的意思。此调度程序以抢先方式实现,这意味着,当出现更高优先级的线程时,该线程会中断(抢占 ...
二叉树的前序、中序、后序遍历的定义:前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树;
后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。
首先创建节点类,并在里面添加了一个创建树的方法,调用后就可以返回一个包含7个节点的二叉树。
123456789101112131415161718192021222324252627282930313233343536373839404142434445public class Node { // 节点值 public int value; // 左子节点 public Node left; // 右子节点 public Node right; Node(int va) { value = va; } Node(int va, Node le, Node ri) { value = va; left = ...
java源码分析
未读java.util包中包含了一系列重要的集合类。本文将从分析源码入手,深入研究一个集合类的内部结构,以及遍历集合的迭代模式的源码实现内幕。
下面我们先简单讨论一个根接口Collection,然后分析一个抽象类AbstractList和它的对应Iterator接口,并仔细研究迭代子模式的实现原理。
本文讨论的源代码版本是JDK 1.4.2,因为JDK 1.5在java.util中使用了很多泛型代码,为了简化问题,所以我们还是讨论1.4版本的代码。
集合类的根接口CollectionCollection接口是所有集合类的根类型。它的一个主要的接口方法是:
1boolean add(Object c)
add()方法将添加一个新元素。注意这个方法会返回一个boolean,但是返回值不是表示添加成功与否。仔细阅读doc可以看到,Collection规定:如果一个集合拒绝添加这个元素,无论任何原因,都必须抛出异常。这个返回值表示的意义是add()方法执行后,集合的内容是否改变了(就是元素有无数量,位置等变化),这是由具体类实现的。即:如果方法出错,总会抛出异常;返回值仅仅表示该方法执行后这个C ...
java并发教程
未读了解Java中sleep()和wait()方法之间的区别。了解何时使用哪种方法以及它们对Java并发带来什么影响。
1. Java sleep()和wait()–讨论sleep()是一种用于暂停该过程几秒钟或我们想要的时间的方法。但是在使用wait()方法的情况下,线程进入等待状态,直到我们调用notify()or ,线程才会自动返回notifyAll()。
主要区别在于等待wait()时sleep()不释放锁定或监视器,而等待时不释放锁定或监视器。wait()通常用于线程间通信,而sleep()通常用于引入执行暂停。
Thread.sleep()将当前线程发送到“ Not Runnable ”状态一段时间。该线程保留已获取的监视器,即,如果该线程当前在某个synchronized块或方法中,则没有其他线程可以进入该块或方法。如果另一个线程调用t.interrupt()。它将唤醒睡眠线程。
While sleep()是一种static方法,这意味着它始终会影响当前线程(正在执行sleep方法的线程)。一个常见的错误是调用t.sleep()where t是另一个线程。即使这样,当前线程也 ...
markdown
未读[TOC]OverviewNearly all Markdown applications support the basic syntax outlined in John Gruber’s original design document. There are minor variations and discrepancies between Markdown processors — those are noted inline wherever possible.
HeadingsTo create a heading, add number signs (#) in front of a word or phrase. The number of number signs you use should correspond to the heading level. For example, to create a heading level three (<h3>), use three number signs (e.g., ### My Header).
...
作为140个字的缔造者,twitter太简单了,又太复杂了,简单是因为仅仅用140个字居然使有几次世界性事件的传播速度超过任何媒体,复杂是因为要为2亿用户提供这看似简单的140个字的服务,这真的是因为简单,所以复杂。本文就将对twitter网站架构的学习体会来与大家一起分享。
一、twitter网站基本情况概览
截至2011年4月,twitter的注册用户约为1.75亿,并以每天300000的新用户注册数增长,但是其真正的活跃用户远远小于这个数目,大部分注册用户都是没有关注者或没有关注别人的,这也是与facebook的6亿活跃用户不能相提并论的。
twitter每月有180万独立访问用户数,并且75%的流量来自twitter.com以外的网站。每天通过API有30亿次请求,每天平均产生5500次tweet,37%活跃用户为手机用户,约60%的tweet来自第三方的应用。
平台:Ruby on Rails 、Erlang 、MySQL 、Mongrel 、Munin 、Nagios 、Google Analytics 、AWStats 、Memcached
下图是twitter的整体架构 ...
Swing 是一个强大的 GUI 工具包;它可扩展、可配置且跨平台。不过 Swing 的灵活性既是它的主要优势也是它的重大弱点。Swing 可以不同的方式构建同一 UI。例如,您可以使用插页、空白边框或填充符在 GUI 组件之间置入间隔。鉴于 Swing 选项太多,了解现有 GUI 如同编写新 GUI 一样令人畏惧,且将其视觉外观与底层代码对应起来也并非易事。(试着在阅读几个使用 GridBagLayout 的代码行时想象一下 GUI。)
不管您是在维护未曾写过的 Swing GUI 还是集成第三方 GUI 组件到您的应用程序中,理解代码的一种合理方法是编写测试。在编写测试的同时您也就熟悉了未知代码的内部构造。这样做会同时产生另一个有价值的结果,即您最终会有一个测试套件,它有助于在维护代码时预防回归的引入。对于第三方 GUI 组件,测试套件有助于查明新版本的库是否引入了任何行为变化。
一开始最好先编写功能测试,以了解 GUI 如何响应用户输入。为 GUI 编写测试比为非可视化代码编写测试更复杂,因为:
理论上,测试必须是自动化的,但是 GUI 则是供人类 — 而非计算机程序 — 使用 ...
系统架构
未读1、软件长期运营存在什么问题 一个大规模的客户端软件的生命周期中,我们可以把它分为两个比较粗的时期。一个是前期的搭建软件的时期,即从无到有的时期;第二个是搭建完成之后,进入的一个稳定的运营时期。第二个时期才是最关键的,在这个时期我们会持续的迭加需求,持续的优化功能,而且第二个时期也是代码在慢慢变质的时期。
在这个时期,你可能会发现:我们的软件慢慢出现模块耦合严重,牵一发而动全身;每个版本都会涌现出老功能的BUG,你没动过的模块也会出BUG;或者改了一个小问题了,带出来很多其他问题;缺乏扩展性,往老模块加新功能非常痛苦;程序的崩溃率越来越高;新员工接手老模块经常不能理解原来的设计思想而改坏;移植一个DLL到另一个软件时,发现必须连带也移植十几个DLL。本文将分享对于这些问题的思考与方法。
2、软件的积木模型 一个运营型的客户端软件,做出来就是为了长期运营,需要不断的迭加功能。而不是做出来,两三年就重写一次。那么这样一个软件就像堆积木一样。一个软件刚开始写了两千行代码,感觉设计得非常好,模块化扩展性都非常好,性能也非常快,都能很好的面向运营。写了两三年之后,就会出现像这种积木一样的 ...
最近参加公司内一个技术规划评审过程中,通过老板对台上的架构师的质疑,学习到几个做技术规划的要点,归纳如下:
1)紧扣业务
虽然是做技术规划,但如果脱离了业务支撑,是引起不了老板兴趣的
2)从实际问题出发
老板只会为解决实际问题的技术规划买单。规划的开头最好能从实际问题出发,比较容易引起老板的注意
3)重点在落地
只有能落地的技术才有说服力,老板不会被天花乱坠的技术词汇给迷惑的,他只会关注最后能落地是哪几项,应该重点谈落地的目标和计划
4)突出关键点和关键路径
其中一个哥们说了很多,非常丰富,但关键点不突出,结果在老板看来就是个零。在表述规划的整个过程中,一定要紧扣关键旋律,让老板用最短的时间理解你的意图
5)少、准、狠
有的哥们搞得规划面面俱到,结果搞得老板不相信,他想要的东西不是大而全的,而是在一个阶段里能一刀见血的,因此搞规划切勿四面开花,把最关键的、老板最关心的抠出来,并确保把它搞定。
6)目标要量化
老板很关心目标,这个胜于具体的行动计划,他需要用这个来最后check你的结果,因此不量化的目标是通不过的
7)和相关的人要事先沟通清楚
技术规划少不了合作方的支持,在汇报之前一定要 ...
