Java多线程之线程同步

线程同步的定义:线程同步是指在同一时间内,只能有一个线程来访问同一个资源(数据变量或者方法)。实现线程的同步主要用到Java关键字synchronized,关于关键字synchronized的介绍可以参考我的博客:http://blog.csdn.net/u013337261/article/details/44903649
关于控制线程同步,主要分为两部分,一方面是指:共享变量,另一方面是指:执行步骤。执行步骤的话就可以用到synchronized关键字。
所以本篇文章主要是讨论第一个方面:共享变量。
共享变量会造成一些问题,如下代码所示:

    class MyRunner implements Runnable
{
public int sum = 0;

public void run() 
{
    System.out.println(Thread.currentThread().getName() + " Start.");
    for (int i = 1; i <= 100; i++)
    {
        sum += i;
    }
    try {
        Thread.sleep(500);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName() + " --- The value of sum is " + sum);
    System.out.println(Thread.currentThread().getName() + " End.");
}

}

private static void sharedVaribleTest() throws InterruptedException
{
MyRunner runner = new MyRunner();
Thread thread1 = new Thread(runner);
Thread thread2 = new Thread(runner);
thread1.setDaemon(true);
thread2.setDaemon(true);
thread1.start();
thread2.start();
thread1.join();
thread2.join();
}

这个示例中,线程用来计算1到100的和,正确结果是5050,但是上述程序返回的结果是10100,原因是两个线程同时对sum进行操作。那么如何实现对共享变量的控制呢?
总共有三种方法来实现对共享变量的控制:
方法一:将“单对象多线程”改为“多对象多线程”
这里又有两种方式来实现:
方式一:使用Thread子类的方式实现多线程;
方式二:使用两个不同的RUnnable实例;
方法二:是共享变量造成的问题,可以将共享变量改为“不共享”,即将其修改为局部变量;
方法三:使用ThreadLocal机制;
前几种方法都比较通俗易懂,最后一种方式可见如下代码:

package com.mkw.daemonthread;

public class MyRunner3 implements Runnable {
public static void main(String[] args) {
    MyRunner3 runner = new MyRunner3();
    Thread thread1 = new Thread(runner);
    Thread thread2 = new Thread(runner);
    thread1.start();
    thread2.start();
}
public ThreadLocal<Integer> t1=new ThreadLocal<Integer>();//把共享变量sum放到ThreadLocal中
public void run() {
    System.out.println(Thread.currentThread().getName()+"start");
    for(int i=0;i<=100;i++){
        if(t1.get()==null){
            t1.set(new Integer(0));
        }
        int sum=t1.get();
        sum+=i;
        t1.set(new Integer(sum));
    }
    System.out.println(Thread.currentThread().getName()
            +"-----the value of sum is "+t1.get());
    System.out.println(Thread.currentThread().getName()+"End");
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值