码迷,mamicode.com
首页 > 编程语言 > 详细

java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提

时间:2014-08-07 00:35:07      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   java   使用   io   strong   数据   

这里举个例子讲解,同步synchronized在什么地方加,以及同步的前提:

 * 1.必须要有两个以上的线程,才需要同步。
 * 2.必须是多个线程使用同一个锁。
 * 3.必须保证同步中只能有一个线程在运行,锁加在哪一块代码

那么我们要思考的地方有:1.知道我们写的哪些是多线程代码

                                  2.明确共享数据

                                  3.明确多线程运行的代码中哪些语句是操作共享数据的。、

            4.要确保使用同一个锁。

 

下面的代码:需求:两个存户分别往银行存钱,每次村100块,分三次存完。

 

class bank{
    private int sum;
    //函数封装代码(加synchronized)==同步块封装代码
    public synchronized void add(int money){
        sum +=money;
        /*try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }*/
        System.out.println("sum="+sum);
    }
    
}


class Cus implements Runnable{
    private bank b = new bank();

    @Override
    public void run() {
        for(int i=0;i<3;i++){
            //System.out.println(Thread.currentThread().getName());
            b.add(100);
        }
    }
}

public class BankDemo {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Cus c1 = new Cus();
        Thread t1 = new Thread(c1);
        Thread t2 = new Thread(c1);
        t1.start();
        t2.start();

    }

}

总结:同步应该加到add方法上面,因为add方法被run方法调用,所以是线程代码,这里的sum是共享数据,add方法 里面 sum +=money;操作共享数据。这里用了在普通方法上面加syncronized代替同步代码块,这也叫做同步函数。那么同步函数用的锁是什么?我们下一节再接着讨论,多线程同步函数。

 

java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提,布布扣,bubuko.com

java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提

标签:style   blog   color   java   使用   io   strong   数据   

原文地址:http://www.cnblogs.com/200911/p/3895976.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!