java多线程同步:浅谈Java多线程的同步问题

多线程同步依靠是对象锁机制synchronized关键字背后就是利用了封锁来实现对共享资源互斥访问

下面以个简单例子来进行对比分析例子要完成工作非常简单就是创建10个线程每个线程都打印从0到99这100个数字我们希望线程的间不会出现交叉乱序打印而是顺序地打印

先来看第段代码这里我们在run思路方法中加入了synchronized关键字希望能对run思路方法进行互斥访问但结果并不如我们希望那样这是这里synchronized锁住是this对象即当前运行线程对象本身代码中创建了10个线程而每个线程都持有this对象对象锁这不能实现线程同步

代码
package com.vista;

MyThread implements java.lang.Runnable
{
    private threadId;

    public MyThread( id)
    {
        this.threadId = id;
    }
    @Override
    public synchronized void run
    {
        for ( i = 0; i < 100; i)
        {
            .out.prln("Thread ID: " + this.threadId + " : " + i);
        }
    }
}
public ThreadDemo
{
    /**
     * @param args
     * @throws InterruptedException
     */
    public void (String args) throws InterruptedException
    {
        for ( i = 0; i < 10; i)
        {
            Thread( MyThread(i)).start;
            Thread.sleep(1);
        }
    }
}

      从上述代码段可以得知要想实现线程同步则这些线程必须去竞争个唯共享对象锁

      基于这种思想我们将第段代码修改如下所示在创建启动线程的前先创建个线程的间竞争使用Object对象然后将这个Object对象引用传递给每个线程对象lock成员变量这样每个线程lock成员都指向同个Object对象我们在run思路方法中对lock对象使用synchronzied块进行局部封锁这样就可以让线程去竞争这个唯共享对象锁从而实现同步

代码
package com.vista;

MyThread implements java.lang.Runnable
{
    private threadId;
    private Object lock;
    public MyThread( id, Object obj)
    {
        this.threadId = id;
        this.lock = obj;
    }
    @Override
    public  void run
    {
        synchronized(lock)
        {
            for ( i = 0; i < 100; i)
            {
                .out.prln("Thread ID: " + this.threadId + " : " + i);
            }
        }
    }
}
public ThreadDemo
{
    /**
     * @param args
     * @throws InterruptedException
     */
    public void (String args) throws InterruptedException
    {
        Object obj = Object;
        for ( i = 0; i < 10; i)
        {
            Thread( MyThread(i, obj)).start;
            Thread.sleep(1);
        }
    }
}

从第 2段代码可知同步关键是多个线程对象竞争同个共享资源即可上面代码中是通过外部创建共享资源然后传递到线程中来实现我们也可以利用类成员变量被所有类例子所共享这特性因此可以将lock用静态成员对象来实现代码如下所示:

代码
package com.vista;

MyThread implements java.lang.Runnable
{
    private threadId;
    private Object lock = Object;
    public MyThread( id)
    {
        this.threadId = id;
    }
    @Override
    public  void run
    {
        synchronized(lock)
        {
            for ( i = 0; i < 100; i)
            {
                .out.prln("Thread ID: " + this.threadId + " : " + i);
            }
        }
    }
}
public ThreadDemo
{
    /**
     * @param args
     * @throws InterruptedException
     */
    public void (String args) throws InterruptedException
    {
        for ( i = 0; i < 10; i)
        {
            Thread( MyThread(i)).start;
            Thread.sleep(1);
        }
    }
}

再来看第段代码例子思路方法中加入sychronized关键字封锁是this对象本身而在静态思路方法中加入sychronized关键字封锁就是类本身静态思路方法是所有类例子对象所共享因此线程对象在访问此静态思路方法时是互斥访问从而可以实现线程同步代码如下所示:

代码
package com.vista;

MyThread implements java.lang.Runnable
{
    private threadId;
   
    public MyThread( id)
    {
        this.threadId = id;
    }
    @Override
    public  void run
    {
        taskHandler(this.threadId);
    }
    private synchronized void taskHandler( threadId)
    {
        for ( i = 0; i < 100; i)
        {
            .out.prln("Thread ID: " + threadId + " : " + i);
        }
    }
}
public ThreadDemo
{
    /**
     * @param args
     * @throws InterruptedException
     */
    public void (String args) throws InterruptedException
    {
        for ( i = 0; i < 10; i)
        {
            Thread( MyThread(i)).start;
            Thread.sleep(1);
        }
    }
}

 

本文来自CSDN博客转载请标明出处:http://blog.csdn.net/phinecos/archive/2010/03/13/5377915.aspx

TAG: java多线程

Tags:  java多线程实例 java多线程 java多线程的例子 java多线程同步

延伸阅读

最新评论

发表评论