??xml version="1.0" encoding="utf-8" standalone="yes"?>麻豆狠色伊人亚洲综合网站 ,亚洲an天堂an在线观看,亚洲女人被黑人巨大进入http://www.tkk7.com/RoyPayne/category/50470.htmlQ敲L想的键盘,滑动灉|的鼠标?/description>zh-cnWed, 12 Dec 2012 11:31:57 GMTWed, 12 Dec 2012 11:31:57 GMT60~写多线EJava应用中的死锁问题http://www.tkk7.com/RoyPayne/archive/2012/12/10/392713.htmlRoyPayneRoyPayneMon, 10 Dec 2012 02:54:00 GMThttp://www.tkk7.com/RoyPayne/archive/2012/12/10/392713.htmlhttp://www.tkk7.com/RoyPayne/comments/392713.htmlhttp://www.tkk7.com/RoyPayne/archive/2012/12/10/392713.html#Feedback0http://www.tkk7.com/RoyPayne/comments/commentRss/392713.htmlhttp://www.tkk7.com/RoyPayne/services/trackbacks/392713.html      死锁是一个经典的多线E问题,因ؓ不同的线E都在等待那些根本不可能被释攄锁,
从而导致所有的工作都无法完成。假设有两个U程Q分别代表两个饥饿的人,他们必须׃n刀叉ƈ轮流吃饭?/div>
他们都需要获得两个锁Q共享刀和共享叉的锁。假如线E?"A" 获得了刀Q而线E?"B" 获得了叉?/div>
U程 A ׃q入d状态来{待获得叉,而线E?B 则阻塞来{待 A 所拥有的刀?br />      
      让所有的U程按照同样的顺序获得一l锁。这U方法消除了 X ?Y 的拥有者分别等待对方的资源的问题?/div>
  多个锁l成一lƈ攑ֈ同一个锁下。前面死锁的例子中,可以创徏一个银器对象的锁。于是在获得刀或叉之前都必获得这个银器的锁?/div>
  那些不会阻塞的可获得资源用变量标志出来。当某个U程获得银器对象的锁Ӟ可以通过查变量来判断是否整个银器集合中的对象锁都可获得。如果是Q它可以获得相关的锁,否则Q就要释放掉银器q个锁ƈE后再尝试?/div>
  最重要的是Q在~写代码前认真仔l地设计整个pȝ。多U程是困隄Q在开始编E之前详l设计系l能够帮助你避免难以发现死锁的问题?/div>


RoyPayne 2012-12-10 10:54 发表评论
]]>java.util.ConcurrentModificationExceptionhttp://www.tkk7.com/RoyPayne/archive/2012/01/06/368024.htmlRoyPayneRoyPayneFri, 06 Jan 2012 09:14:00 GMThttp://www.tkk7.com/RoyPayne/archive/2012/01/06/368024.htmlhttp://www.tkk7.com/RoyPayne/comments/368024.htmlhttp://www.tkk7.com/RoyPayne/archive/2012/01/06/368024.html#Feedback0http://www.tkk7.com/RoyPayne/comments/commentRss/368024.htmlhttp://www.tkk7.com/RoyPayne/services/trackbacks/368024.html工作中碰CConcurrentModificationException。代码如下:
List list = ...;
for(Iterator iter = list.iterator(); iter.hasNext();) {
    Object obj = iter.next();
    ...
    if(***) {
        list.remove(obj);
    }
}
在执行了removeҎ之后Q再L行@环,iter.next()的时候,报java.util.ConcurrentModificationException(当然Q如果remove的是最后一条,׃会再L行next()操作?

下面来看一下源?/span>
public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove();
}

public interface Collection<E> extends Iterable<E> {
    ...
    Iterator<E> iterator();
    boolean add(E o);
    boolean remove(Object o);
    ...
}

q里有两个removeҎ

接下来来看看AbstractList
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {  
//AbstractCollection和List都承了Collection
    protected transient int modCount = 0;
    private class Itr implements Iterator<E> {  //内部cItr
        int cursor = 0;
        int lastRet = -1;
        int expectedModCount = modCount;

        public boolean hasNext() {
            return cursor != size();
        }

        public E next() {
            checkForComodification();  //特别注意q个Ҏ
            try {
                E next = get(cursor);
                lastRet = cursor++;
                return next;
            } catch(IndexOutOfBoundsException e) {
                checkForComodification();
                throw new NoSuchElementException();
            }
        }

        public void remove() {
            if (lastRet == -1)
                throw new IllegalStateException();
            checkForComodification();

            try {
                AbstractList.this.remove(lastRet);  //执行remove对象的操?br style="box-sizing: border-box; " />                if (lastRet < cursor)
                    cursor--;
                lastRet = -1;
                expectedModCount = modCount;  //重新讄了expectedModCount的|避免了ConcurrentModificationException的?br style="box-sizing: border-box; " />            } catch(IndexOutOfBoundsException e) {
                throw new ConcurrentModificationException();
            }
        }

        final void checkForComodification() {
            if (modCount != expectedModCount)  //当expectedModCount和modCount不相{时Q就抛出ConcurrentModificationException
                throw new ConcurrentModificationException();
        }
    }    
}


remove(Object o)在ArrayList中实现如下:
public boolean remove(Object o) {
    if (o == null) {
            for (int index = 0; index < size; index++)
        if (elementData[index] == null) {
            fastRemove(index);
            return true;
        }
    } else {
        for (int index = 0; index < size; index++)
            if (o.equals(elementData[index])) {
                fastRemove(index);
                return true;
            }
    }
    return false;
}
private void fastRemove(int index) {
    modCount++;  //只增加了modCount
    ....
}

所以,产生ConcurrentModificationException的原因就是:
执行remove(Object o)Ҏ之后QmodCount和expectedModCount不相{了。然后当代码执行到next()ҎӞ判断了checkForComodification()Q发C个数g{,抛Z该Exception?br style="box-sizing: border-box; " />要避免这个ExceptionQ就应该使用remove()Ҏ?/strong>

q里我们׃看add(Object o)Ҏ了,也是同样的原因,但没有对应的add()Ҏ。一般嘛Q就另徏一个List?/span>


下面是网上的其他解释Q更能从本质上解释原因:
Iterator 是工作在一个独立的U程中,q且拥有一?mutex 锁?Iterator 被创Z后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化Ӟq个索引表的内容不会同步改变Q所以当索引指针往后移动的时候就找不到要q代的对象,所以按?fail-fast 原则 Iterator 会马上抛?java.util.ConcurrentModificationException 异常?/span>
所?Iterator 在工作的时候是不允许被q代的对象被改变的。但你可以?Iterator 本n的方?remove() 来删除对象, Iterator.remove() Ҏ会在删除当前q代对象的同时维护烦引的一致性?/span>


RoyPayne 2012-01-06 17:14 发表评论
]]>U程----BlockingQueue (?http://www.tkk7.com/RoyPayne/archive/2012/01/06/368018.htmlRoyPayneRoyPayneFri, 06 Jan 2012 08:32:00 GMThttp://www.tkk7.com/RoyPayne/archive/2012/01/06/368018.htmlhttp://www.tkk7.com/RoyPayne/comments/368018.htmlhttp://www.tkk7.com/RoyPayne/archive/2012/01/06/368018.html#Feedback0http://www.tkk7.com/RoyPayne/comments/commentRss/368018.htmlhttp://www.tkk7.com/RoyPayne/services/trackbacks/368018.htmlimport java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
/**
    本例介绍一个特D的队列:BlockingQueue,如果BlockQueue是空?从BlockingQueue取东西的操作会被阻断进入等待状?直到BlockingQueueq了东西才会被唤?同样,如果BlockingQueue是满?M试图往里存东西的操作也会被Lq入{待状?直到BlockingQueue里有I间才会被唤醒l操?
    本例再次实现11.4U程----条gCondition中介l的子E序,不过q个子中最多能攄ҎC?,可以随意指定.当篮子满?生者进入等待状?当篮子空?消费者等?
 
*/
/**
    使用BlockingQueue的关键技术点如下:
    1.BlockingQueue定义的常用方法如?
        1)add(anObject):把anObject加到BlockingQueue?卛_果BlockingQueue可以容纳,则返回true,否则招聘异常
        2)offer(anObject):表示如果可能的话,anObject加到BlockingQueue?卛_果BlockingQueue可以容纳,则返回true,否则q回false.
        3)put(anObject):把anObject加到BlockingQueue?如果BlockQueue没有I间,则调用此Ҏ的线E被L直到BlockingQueue里面有空间再l箋.
        4)poll(time):取走BlockingQueue里排在首位的对象,若不能立卛_?则可以等time参数规定的时?取不到时q回null
        5)take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,Lq入{待状态直到Blocking有新的对象被加入为止
    2.BlockingQueue有四个具体的实现c?Ҏ不同需?选择不同的实现类
        1)ArrayBlockingQueue:规定大小的BlockingQueue,其构造函数必d一个int参数来指明其大小.其所含的对象是以FIFO(先入先出)序排序?
        2)LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大的参数,生成的BlockingQueue有大限?若不带大参?所生成的BlockingQueue的大由Integer.MAX_VALUE来决?其所含的对象是以FIFO(先入先出)序排序?br />        3)PriorityBlockingQueue:cM于LinkedBlockQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的Comparator军_的顺?
        4)SynchronousQueue:Ҏ的BlockingQueue,对其的操作必L攑֒取交替完成的.
    3.LinkedBlockingQueue和ArrayBlockingQueue比较h,它们背后所用的数据l构不一?DLinkedBlockingQueue的数据吞吐量要大于ArrayBlockingQueue,但在U程数量很大时其性能的可预见性低于ArrayBlockingQueue.         
 
*/
public class BlockingQueueTest {
       /**定义装苹果的子*/
       public static class Basket{
              //子,能够容纳3个苹?/span>
              BlockingQueue<String> basket = new ArrayBlockingQueue<String>(3);
              //生Ҏ,攑օ子
              public void produce() throws InterruptedException{
                     //putҎ攑օ一个苹?若basket满了,{到basket有位|?/span>
                     basket.put("An apple");
              }
              //消费Ҏ,从篮子中取走
              public String consume() throws InterruptedException{
                     //takeҎ取出一个苹?若basket为空,{到basket有苹果ؓ?/span>
                     return basket.take();
              }
       }
       //试Ҏ
       public static void testBasket(){
              final Basket basket = new Basket();//建立一个装Ҏ的篮?br />              //定义Ҏ生?/span>
              class Producer implements Runnable{
                     public void run(){
                            try{
                                   while(true){
                                          //生Ҏ
                                          System.out.println("生者准备生产苹? " + System.currentTimeMillis());
                                          basket.produce();
                                          System.out.println("生者生产苹果完? " + System.currentTimeMillis());
                                          //休眠300ms
                                          Thread.sleep(300);
                                   }
                            }catch(InterruptedException ex){
                            }
                     }
              }
              //定义Ҏ消费?/span>
              class Consumer implements Runnable{
                     public void run(){
                            try{
                                   while(true){
                                          //消费Ҏ
                                          System.out.println("消费者准备消费苹? " + System.currentTimeMillis());
                                          basket.consume();
                                          System.out.println("消费者消费苹果完? " + System.currentTimeMillis());
                                          //休眠1000ms
                                          Thread.sleep(1000);
                                   }
                            }catch(InterruptedException ex){
                            }
                     }
              }
              ExecutorService service = Executors.newCachedThreadPool();
              Producer producer = new Producer();
              Consumer consumer = new Consumer();
              service.submit(producer);
              service.submit(consumer);
              //E序q行5s?所有Q务停?/span>
              try{
                     Thread.sleep(5000);
              }catch(InterruptedException ex){
              }
              service.shutdownNow();
       }
       public static void main(String[] args){
              BlockingQueueTest.testBasket();
       }
}


RoyPayne 2012-01-06 16:32 发表评论
]]>如何在java中正用volatilehttp://www.tkk7.com/RoyPayne/archive/2012/01/06/367989.htmlRoyPayneRoyPayneFri, 06 Jan 2012 02:44:00 GMThttp://www.tkk7.com/RoyPayne/archive/2012/01/06/367989.htmlhttp://www.tkk7.com/RoyPayne/comments/367989.htmlhttp://www.tkk7.com/RoyPayne/archive/2012/01/06/367989.html#Feedback0http://www.tkk7.com/RoyPayne/comments/commentRss/367989.htmlhttp://www.tkk7.com/RoyPayne/services/trackbacks/367989.html   Java? 语言包含两种内在的同步机Ӟ同步块(或方法)?volatile 变量。这两种机制的提出都是ؓ了实C码线E的安全性。其?Volatile 变量的同步性较差(但有时它更简单ƈ且开销更低Q,而且其用也更容易出错。在q期?nbsp;Java 理论与实?/em>中,Brian Goetz 介l几U正?volatile 变量的模式,q对其适用性限制提Z些徏议?/span>
  Java 语言中的 volatile 变量可以被看作是一U?“E度较轻?synchronized”Q与 synchronized 块相比,volatile 变量所需的编码较,q且q行时开销也较,但是它所能实现的功能也仅?synchronized 的一部分。本文介l了几种有效使用 volatile 变量的模式,q强调了几种不适合使用 volatile 变量的情形?/span>
  锁提供了两种主要Ҏ:互斥Qmutual exclusionQ?/em>?/span>可见性(visibilityQ?/em>。互斥即一ơ只允许一个线E持有某个特定的锁,因此可用该Ҏ实现对׃n数据的协调访问协议,q样Q一ơ就只有一个线E能够用该׃n数据。可见性要更加复杂一些,它必ȝ保释N之前对共享数据做出的更改对于随后获得该锁的另一个线E是可见?—— 如果没有同步机制提供的这U可见性保证,U程看到的共享变量可能是修改前的值或不一致的|q将引发许多严重问题?/span>

Volatile 变量

  Volatile 变量h synchronized 的可见性特性,但是不具备原子特性。这是说线E能够自动发?volatile 变量的最新倹{Volatile 变量可用于提供线E安全,但是只能应用于非常有限的一l用例:多个变量之间或者某个变量的当前g修改后g间没有约束。因此,单独使用 volatile q不以实现计数器、互斥锁或Q何具有与多个变量相关的不变式QInvariantsQ的c(例如 “start <=end”Q?/span>
  Z易性或可׾~性的考虑Q您可能們֐于?volatile 变量而不是锁。当使用 volatile 变量而非锁时Q某些习惯用法(idiomQ更加易于编码和阅读。此外,volatile 变量不会像锁那样造成U程dQ因此也很少造成可׾~性问题。在某些情况下,如果L作远q大于写操作Qvolatile 变量q可以提供优于锁的性能优势?/span>

正确使用 volatile 变量的条?/h3>  您只能在有限的一些情形下使用 volatile 变量替代锁。要?volatile 变量提供理想的线E安全,必须同时满下面两个条gQ?/span>
  ● 对变量的写操作不依赖于当前倹{?/span>
  ● 该变量没有包含在h其他变量的不变式中?/span>
  实际上,q些条g表明Q可以被写入 volatile 变量的这些有效值独立于ME序的状态,包括变量的当前状态?/span>
  W一个条件的限制?volatile 变量不能用作U程安全计数器。虽然增量操作(x++Q看上去cM一个单独操作,实际上它是一个由dQ修改-写入操作序列l成的组合操作,必须以原子方式执行,?volatile 不能提供必须的原子特性。实现正的操作需要 x 的值在操作期间保持不变Q?volatile 变量无法实现q点。(然而,如果D整ؓ只从单个U程写入Q那么可以忽略第一个条件。)
  大多数编E情形都会与q两个条件的其中之一冲突Q?volatile 变量不能?synchronized 那样普遍适用于实现线E安全。清?1 昄了一个非U程安全的数D围类。它包含了一个不变式 —— 下界L于或等于上界?br />       
       
清单 1. 非线E安全的数D围类
@NotThreadSafe 
public class NumberRange { 
private int lower, upper; 
public int getLower() { return lower; } 
public int getUpper() { return upper; } 
public void setLower(int value) { 
if (value > upper) 
throw new IllegalArgumentException(); 
lower = value; 

public void setUpper(int value) { 
if (value < lower) 
throw new IllegalArgumentException(); 
upper = value; 

}

q种方式限制了范围的状态变量,因此?lower ?upper 字段定义?volatile cd不能够充分实现类的线E安全;从而仍焉要用同步。否则,如果凑y两个U程在同一旉使用不一致的值执?setLower ?setUpper 的话Q则会范围处于不一致的状态。例如,如果初始状态是 (0, 5)Q同一旉内,U程 A 调用 setLower(4) q且U程 B 调用 setUpper(3)Q显然这两个操作交叉存入的值是不符合条件的Q那么两个线E都会通过用于保护不变式的查,使得最后的范围值是 (4, 3) —— 一个无效倹{至于针对范围的其他操作Q我们需要 setLower() ?setUpper() 操作原子?—— 而将字段定义?volatile cd是无法实现这一目的的?/span>

性能考虑

  使用 volatile 变量的主要原因是其简易性:在某些情形下Q?volatile 变量要比使用相应的锁单得多。?volatile 变量ơ要原因是其性能Q某些情况下Qvolatile 变量同步机制的性能要优于锁?/span>
  很难做出准确、全面的评hQ例?“X L?Y ?#8221;Q尤其是?JVM 内在的操作而言。(例如Q某些情况下 VM 也许能够完全删除锁机Ӟq得我们难以抽象地比较 volatile?synchronized 的开销。)是_在目前大多数的处理器架构上,volatile L作开销非常?—— 几乎和非 volatile L作一栗?volatile 写操作的开销要比?volatile 写操作多很多Q因保证可见性需要实现内存界定(Memory FenceQ,即便如此Qvolatile 的d销仍然要比锁获取低?/span>
  volatile 操作不会像锁一样造成dQ因此,在能够安全?volatile 的情况下Qvolatile 可以提供一些优于锁的可伸羃Ҏ。如果读操作的次数要q远过写操作,与锁相比Qvolatile 变量通常能够减少同步的性能开销?/span>

正确使用 volatile 的模?/h3>  很多q发性专家事实上往往引导用户q离 volatile 变量Q因Z用它们要比用锁更加Ҏ出错。然而,如果谨慎地遵循一些良好定义的模式Q就能够在很多场合内安全C?volatile 变量。要始终牢记使用 volatile 的限?—— 只有在状态真正独立于E序内其他内Ҏ才能使用 volatile —— q条规则能够避免这些模式扩展到不安全的用例?/span>
  模式 #1Q状态标?/strong> 也许实现 volatile 变量的规范用仅仅是使用一个布状态标志,用于指示发生了一个重要的一ơ性事Ӟ例如完成初始化或h停机?/span>
  很多应用E序包含了一U控制结构,形式?“在还没有准备好停止程序时再执行一些工?#8221;Q如清单 2 所C:
  清单 2. ?volatile 变量作ؓ状态标志?/strong>


volatile boolean shutdownRequested; 
 
public void shutdown() { shutdownRequested = true; } 
public void doWork() { 
while (!shutdownRequested) { 
// do stuff 

}
很可能会从@环外部调?shutdown() Ҏ —— 卛_另一个线E中 —— 因此Q需要执行某U同步来保正确实现 shutdownRequested 变量的可见性。(可能会从 JMX 侦听E序、GUI 事gU程中的操作侦听E序、通过 RMI 、通过一?Web 服务{调用)。然而,使用 synchronized 块编写@环要比用清?2 所C的 volatile 状态标志编写麻烦很多。由?volatile 化了~码Qƈ且状态标志ƈ不依赖于E序内Q何其他状态,因此此处非常适合使用 volatile?/span>
  q种cd的状态标记的一个公q性是Q通常只有一U状态{换;shutdownRequested 标志?false 转换?trueQ然后程序停止。这U模式可以扩展到来回转换的状态标志,但是只有在{换周期不被察觉的情况下才能扩展(?false ?trueQ再转换?falseQ。此外,q需要某些原子状态{换机Ӟ例如原子变量?/span>
  模式 #2Q一ơ性安全发布(one-time safe publicationQ?/strong>
  ~Z同步会导致无法实现可见性,q得确定何时写入对象引用而不是原语值变得更加困难。在~Z同步的情况下Q可能会遇到某个对象引用的更新|由另一个线E写入)和该对象状态的旧值同时存在。(q就是造成著名的双重检查锁定(double-checked-lockingQ问题的ҎQ其中对象引用在没有同步的情况下q行L作,产生的问题是您可能会看到一个更新的引用Q但是仍然会通过该引用看C完全构造的对象Q?/span>
  实现安全发布对象的一U技术就是将对象引用定义?volatile cd。清?3 展示了一个示例,其中后台U程在启动阶D从数据库加载一些数据。其他代码在能够利用q些数据Ӟ在用之前将查这些数据是否曾l发布过?/span>
  清单 3. ?volatile 变量用于一ơ性安全发?/strong>

public class BackgroundFloobleLoader { 
public volatile Flooble theFlooble; 
public void initInBackground() { 
// do lots of stuff 
theFlooble = new Flooble(); // this is the only write to theFlooble 


public class SomeOtherClass { 
public void doWork() { 
while (true) { 
// do some stuff 
// use the Flooble, but only if it is ready 
if (floobleLoader.theFlooble != null
doSomething(floobleLoader.theFlooble); 


}

如果 theFlooble 引用不是 volatile cdQdoWork() 中的代码在解除对 theFlooble 的引用时Q将会得C个不完全构造的 Flooble?/span>
  该模式的一个必要条件是Q被发布的对象必LU程安全的,或者是有效的不可变对象Q有效不可变意味着对象的状态在发布之后永远不会被修改)。volatile cd的引用可以确保对象的发布形式的可见性,但是如果对象的状态在发布后将发生更改Q那么就需要额外的同步?/span>
  模式 #3Q独立观察(independent observationQ?/strong>
  安全使用 volatile 的另一U简单模式是Q定?“发布” 观察l果供程序内部用。例如,假设有一U环境传感器能够感觉环境温度。一个后台线E可能会每隔几秒d一ơ该传感器,q更新包含当前文档的 volatile 变量。然后,其他U程可以dq个变量Q从而随时能够看到最新的温度倹{?/span>
  使用该模式的另一U应用程序就是收集程序的l计信息。清?4 展示了n份验证机制如何记忆最q一ơ登录的用户的名字。将反复使用 lastUser 引用来发布|以供E序的其他部分用?/span>
  清单 4. ?volatile 变量用于多个独立观察l果的发?/span>
public class UserManager { 
public volatile String lastUser; 
public boolean authenticate(String user, String password) { 
boolean valid = passwordIsValid(user, password); 
if (valid) { 
User u = new User(); 
activeUsers.add(u); 
lastUser = user; 

return valid; 

}

该模式是前面模式的扩展;某个值发布以在程序内的其他地方用,但是与一ơ性事件的发布不同Q这是一pd独立事g。这个模式要求被发布的值是有效不可变的 —— 卛_的状态在发布后不会更攏V用该值的代码需要清楚该值可能随时发生变化?/span>
  模式 #4Q?#8220;volatile bean” 模式
  volatile bean 模式适用于将 JavaBeans 作ؓ“荣誉l构”使用的框架。在 volatile bean 模式中,JavaBean 被用作一l具?getter ??setter Ҏ 的独立属性的容器。volatile bean 模式的基本原理是Q很多框架ؓ易变数据的持有者(例如 HttpSessionQ提供了容器Q但是放入这些容器中的对象必LU程安全的?/span>
  ?volatile bean 模式中,JavaBean 的所有数据成员都?volatile cd的,q且 getter ?setter Ҏ必须非常普?—— 除了获取或设|相应的属性外Q不能包含Q何逻辑。此外,对于对象引用的数据成员,引用的对象必L有效不可变的。(q将止h数组值的属性,因ؓ当数l引用被声明?volatile Ӟ只有引用而不是数l本w具?volatile 语义Q。对于Q?volatile 变量Q不变式或约束都不能包含 JavaBean 属性。清?5 中的CZ展示了遵?volatile bean 模式?JavaBeanQ?/span>
  清单 5. 遵守 volatile bean 模式?Person 对象

@ThreadSafe 
public class Person { 
private volatile String firstName; 
private volatile String lastName; 
private volatile int age; 
public String getFirstName() { return firstName; } 
public String getLastName() { return lastName; } 
public int getAge() { return age; } 
public void setFirstName(String firstName) { 
this.firstName = firstName; 

public void setLastName(String lastName) { 
this.lastName = lastName; 

public void setAge(int age) { 
this.age = age; 

}

volatile 的高U模?/strong>
  前面几节介绍的模式涵盖了大部分的基本用例Q在q些模式中?volatile 非常有用q且单。这一节将介绍一U更加高U的模式Q在该模式中Qvolatile 提供性能或可伸羃性优ѝ?/span>
  volatile 应用的的高模式非常脆弱。因此,必须对假讄条g仔细证明Qƈ且这些模式被严格地封装了hQ因为即佉K常小的更改也会损坏您的代码!同样Q用更高?volatile 用例的原因是它能够提升性能Q确保在开始应用高U模式之前,真正定需要实现这U性能L。需要对q些模式q行权衡Q放弃可L或可维护性来换取可能的性能收益 —— 如果您不需要提升性能Q或者不能够通过一个严格的试E序证明您需要它Q,那么q很可能是一ơ糟p的交易Q因为您很可能会得不偿失Q换来的东西要比攑ּ的东西h值更低?/span>
  模式 #5Q开销较低的读Q写锁策?/strong>
  目前为止Q您应该了解?volatile 的功能还不以实现计数器。因?++x 实际上是三种操作Q读、添加、存储)的简单组合,如果多个U程凑y试图同时?volatile 计数器执行增量操作,那么它的更新值有可能会丢失?/span>
  然而,如果L作远q超q写操作Q您可以l合使用内部锁和 volatile 变量来减公׃码\径的开销。清?6 中显C的U程安全的计数器使用 synchronized 保增量操作是原子的Qƈ使用 volatile 保证当前l果的可见性。如果更C频繁的话Q该Ҏ可实现更好的性能Q因路径的开销仅仅涉及 volatile L作,q通常要优于一个无竞争的锁获取的开销?/span>
  清单 6. l合使用 volatile ?synchronized 实现 “开销较低的读Q写?#8221;
@ThreadSafe 
public class CheesyCounter { 
// Employs the cheap read-write lock trick 
// All mutative operations MUST be done with the 'this' lock held 
@GuardedBy("this") private volatileint value; 
public int getValue() { return value; } 
public synchronizedint increment() { 
return value++; 

}

之所以将q种技术称之ؓ “开销较低的读Q写?#8221; 是因为您使用了不同的同步机制q行d操作。因为本例中的写操作q反了?volatile 的第一个条Ӟ因此不能使用 volatile 安全地实现计数器 —— 您必M用锁。然而,您可以在L作中使用 volatile 保当前值的可见?/em>Q因此可以用锁q行所有变化的操作Q?volatile q行只读操作。其中,锁一ơ只允许一个线E访问|volatile 允许多个U程执行L作,因此当?volatile 保证M码\径时Q要比用锁执行全部代码路径获得更高的共享度 —— 像读-写操作一栗然而,要随时牢记这U模式的qQ如果超了该模式的最基本应用Q结合这两个竞争的同步机制将变得非常困难?/span>
  l束?/strong>
  与锁相比QVolatile 变量是一U非常简单但同时又非常脆q同步机制Q它在某些情况下提供优于锁的性能和׾~性。如果严格遵?volatile 的用条?—— 卛_量真正独立于其他变量和自׃前的?—— 在某些情况下可以使用 volatile 代替 synchronized 来简化代码。然而,使用 volatile 的代码往往比用锁的代码更加容易出错。本文介l的模式늛了可以?volatile 代替 synchronized 的最常见的一些用例。遵循这些模式(注意使用时不要超q各自的限制Q可以帮助您安全地实现大多数用例Q?volatile 变量获得更佳性能?/span>




RoyPayne 2012-01-06 10:44 发表评论
]]>java ?Thread.sleep() ?Thread.wait() 的区?/title><link>http://www.tkk7.com/RoyPayne/archive/2012/01/05/367910.html</link><dc:creator>RoyPayne</dc:creator><author>RoyPayne</author><pubDate>Thu, 05 Jan 2012 06:32:00 GMT</pubDate><guid>http://www.tkk7.com/RoyPayne/archive/2012/01/05/367910.html</guid><wfw:comment>http://www.tkk7.com/RoyPayne/comments/367910.html</wfw:comment><comments>http://www.tkk7.com/RoyPayne/archive/2012/01/05/367910.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/RoyPayne/comments/commentRss/367910.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/RoyPayne/services/trackbacks/367910.html</trackback:ping><description><![CDATA[<div><pre style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; white-space: pre-wrap; font-size: 14px; line-height: 22px; background-color: #ffffff; ">两者的区别有:<br /> 1、最主要是sleepҎ没有释放锁,而waitҎ释放了锁Q得其?a target="_blank" style="color: #005599; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #005599; ">U程</a>可以使用<a target="_blank" style="color: #005599; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #005599; ">同步控制</a>块或者方法?2、这两个Ҏ来自不同的类分别是Thread和Object<br /><br /> 3、waitQnotify和notifyAll只能在同步控制方法或者同步控制块里面使用Q而sleep可以?br /> M地方使用<br /> synchronized(x){<br /> x.notify()<br /> //或者wait()<br /> }<br /> 4、sleep必须捕获异常Q而waitQnotify和notifyAll不需要捕获异?/pre></div><img src ="http://www.tkk7.com/RoyPayne/aggbug/367910.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/RoyPayne/" target="_blank">RoyPayne</a> 2012-01-05 14:32 <a href="http://www.tkk7.com/RoyPayne/archive/2012/01/05/367910.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lock和Synchronizedhttp://www.tkk7.com/RoyPayne/archive/2011/12/28/367436.htmlRoyPayneRoyPayneWed, 28 Dec 2011 09:22:00 GMThttp://www.tkk7.com/RoyPayne/archive/2011/12/28/367436.htmlhttp://www.tkk7.com/RoyPayne/comments/367436.htmlhttp://www.tkk7.com/RoyPayne/archive/2011/12/28/367436.html#Feedback0http://www.tkk7.com/RoyPayne/comments/commentRss/367436.htmlhttp://www.tkk7.com/RoyPayne/services/trackbacks/367436.html
1.代码层的区别?br />synchronized cM面向对象 修饰 c,ҎQ对象?br />lock不作Z饎ͼcM面向q程Q在Ҏ中需要锁的时候lockQ在l束的时候unlock。(一般在finally块里Q?br />
2.性能
q发高,lock有优ѝ低q发 synchronized 有优ѝ?br />
3.实现机制

synchronized 对象加锁


RoyPayne 2011-12-28 17:22 发表评论
]]>
java 里面volatile什么意思啊http://www.tkk7.com/RoyPayne/archive/2011/12/28/367405.htmlRoyPayneRoyPayneWed, 28 Dec 2011 05:58:00 GMThttp://www.tkk7.com/RoyPayne/archive/2011/12/28/367405.htmlhttp://www.tkk7.com/RoyPayne/comments/367405.htmlhttp://www.tkk7.com/RoyPayne/archive/2011/12/28/367405.html#Feedback0http://www.tkk7.com/RoyPayne/comments/commentRss/367405.htmlhttp://www.tkk7.com/RoyPayne/services/trackbacks/367405.html Volatile修饰的成员变量在每次被线E访问时Q都从共享内存中重读该成员变量的倹{而且Q当成员变量发生变化ӞU程变化值回写到׃n内存。这样在M时刻Q两

个不同的U程L看到某个成员变量的同一个倹{? Java语言规范中指出:Z获得最佳速度Q允许线E保存共享成员变量的U有拯Q而且只当U程q入或者离开同步代码块时才与

׃n成员变量的原始值对比? q样当多个线E同时与某个对象交互Ӟ必要注意到要让线E及时的得到׃n成员变量的变化? 而volatile关键字就是提CVMQ对于这个成员变?/span>

不能保存它的U有拯Q而应直接与共享成员变量交互? 使用Q在两个或者更多的U程讉K的成员变量上使用volatile。当要访问的变量已在synchronized代码块中Q或者ؓ帔R

Ӟ不必使用? ׃使用volatile屏蔽掉了VM中必要的代码优化Q所以在效率上比较低Q因此一定在必要时才使用此关键字? pC中的一?止~译器进行优化~~~~

RoyPayne 2011-12-28 13:58 发表评论
]]>
վ֩ģ壺 һѻɫƬ| ɫַ| 91Ƶ| Ƶֻ| ޾Ʒѿ| ɫͼУ԰ɫ| ŷ޴Ƭ| ղһ | ޹Ʒۺһ | þþþþAVվ| һ| ˵վ| Ļ߹ۿ| ëƬŮ-ٶ| AVӰ߹ۿ| jizzjizzƵȫ| ѹëƬ| һɫþ88ۺ޾Ʒ | ҹҹҹҹƵ | ŮƷþþþþþ| ɫһվ| ˾޾ƷӰwww| Ļ˾ƷAV| һɪ| ѹaƬ| һ| ޹ƷҹӰ| ɫƬѹۿ| aƬѹۿƵ| ޴ɫ߹ۿ| ٸaëƬ˳| ۲Ƶwwwѹۿ| Ʒ߹ۿ| ޳aƬ߹ۿ| 99þ޾ƷѶ| AVŮ18ëƬˮ| ޳AVƬһ| ëƬƵ| ѹۿӰ| Ļ9| Ʒһ߹ۿ |