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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程机制2(安全问题)相关的知识,希望对你有一定的参考价值。

线程状态图:

技术分享

 

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

/*
* 线程安全问题
*
* 产生的原因:
* 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(安全问题)的主要内容,如果未能解决你的问题,请参考以下文章

java中多线程安全性和同步的常用方法

Java多线程:线程同步详解

java 多线程9 : synchronized锁机制 之 代码块锁

java 多线程 day03 线程同步

线程的同步机制:同步代码块&同步方法

java多线程 -- 同步鎖