background image

确的话还请大家多多包涵了,反正有错误希望博友们能及时指出来了。

  Synchronized 的产生是为了解决线程冲突换句话说是共享资源共享的问题。从

这个概念里面我们发现它包含了两个实体,一个是共享资源,一个是使用共享资源的方
法。我在这里设定一个场景,把这一切的要素都放到一个类中,那么共享资源就是这个类
的一个属性(不是静态的,我们谈论这个问题前提是所有的属性和方法属于对象,而不是
属于类),而且一般为了保护类里面的属性,这个属性往往是私有的(private),而所有在
这个类中的能访问到这个属性的方法都加 synchronized,这么一看我们就明白了,
synchronized 在为所有方法加锁了,这种做法的结果就是当某一个线程正在使用带有
synchronized 关键字的方法时候,只要这个方法还在运行没有结束,其他所有该类带
有 synchronized 的方法的线程都会被锁住。

  这里要强调一下,锁的机制一定是在对象的不同方法上的,如果是不同对象的

同一个方法对于同一个资源的访问是不存在冲突的问题,换句话说线程里线程的调度是
以方法为单位进行调度的,例如方法 A 抢占到了 CPU 的时间片,那么方法 B 就被挂起了,
但是在内存中方法 A 应该是唯一的,因此不存在一个对象的 A 使用另一个对象的方法 A
是被挂起的,也许这个说法大家可能不太好理解,我举个例子吧,大家看下面的代码:

package cn.com.sxia;

public class SingleMethodThread{    
    private volatile int i = 10;    
    public void release(){
        System.out.println("前数值是:" + i);
        if (i != 0){
            --i;
        }else{
            System.exit(0);
        }
        System.out.println("后数值是:" + i);
    }

}
 
package cn.com.sxia;

public class SingleMethodThreadTester extends Thread {    
    private volatile SingleMethodThread smt;    
    public SingleMethodThreadTester(SingleMethodThread smt){
        this.smt = smt;
        start();
    }

    public void run(){
        while(true){
            smt.release();
            yield();