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(安全问题)的主要内容,如果未能解决你的问题,请参考以下文章