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

java多线程机制2(安全问题)

时间:2016-02-01 15:21:40      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:

线程状态图:

技术分享

 

=================================================================================

/*
* 线程安全问题
*
* 产生的原因:
* 1、线程任务中,有处理共享的数据。
* 2、线程任务中有多条对共享数据的操作。
* 一个线程在操作共享数据的过程中,其他线程参与了运算,造成了数据的错误。
*
* 解决的思想:
* 只要能保证多条操作共享数据的代码在某一时间段,被一条线程所执行,在执行期间不允许其他线程参与运算。
*
* 同步代码块解决
* synchronized (对象obj) {需要同步的代码},这里的obj对象就相当于加锁。
* 同步在目前情况下保证了一次只能有一个线程在执行,其他线程进不来。这就是同步锁机制。
* 好处:解决了多线程安全问题。
* 弊端:减低效率。
*
* 有可能出现这样一种情况:
* 多线程安全问题出现后,加入同步机制,没想到,安全问题依旧。
* 这是肯定是同步出了问题
* 只要遵守了同步的前提,就可以解决。
* 同步的前提:
* 多个线程在同步中,必须使用同一个锁。这才是对多个线程同步。
*/

package thread;

//定义银行类
class Blank{
    private int sum;//银行总共的存款
    private Object obj = new Object();
    public void add(int num){
        synchronized (obj) {//这里的obj相当于一把锁
            sum = sum + num;
            try {
                Thread.sleep(1000);//这里我们让线程睡一秒钟,这样cpu时间片可以充分的切换到其他线程上
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("sum="+sum);
        }
    }
}

//定义储户类
class Customer implements Runnable{

    Blank blank = new Blank();
    @Override
    public void run() {
        //每个储户往银行循环存三次钱,每次100
        for (int i = 0; i < 3; i++) {
            blank.add(100);
        }
        
    }
    
}
public class ThreadDemo3 {

    public static void main(String[] args) {
        //创建实现了Runable接口的线程任务对象
        Customer customer = new Customer();
        Thread t1 = new Thread(customer);
        Thread t2 = new Thread(customer);
        Thread t3 = new Thread(customer);
        //开启三条线程模拟三个储户存款
        t1.start();
        t2.start();
        t3.start();
    }
    
}

 运行结果图:可以看到每过一秒钟,会输出一次结果

技术分享

java多线程机制2(安全问题)

标签:

原文地址:http://www.cnblogs.com/zhouxuan323/p/5175120.html

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