java多线程机制2(安全问题)
线程状态图:

=================================================================================
/*
* 线程安全问题
*
* 产生的原因:
* 1、线程任务中,有处理共享的数据。
* 2、线程任务中有多条线程对共享数据的操作。
* 一个线程在操作共享数据的过程中,其他线程参与了运算,造成了数据的错误。
*
* 解决的思想:
* 只要能保证多条操作共享数据的代码在某一时间段,被一条线程所执行,在执行期间不允许其他线程参与运算。
*
* 同步代码块(或者是同步函数)解决
* synchronized (对象obj) {需要同步的代码},这里的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();
} }
上面的add方法中的同步代码块,可以直接将add修饰为同步函数,也可以达到同样的效果。
同步代码块的锁是上面的obj,同步函数使用的锁是什么呢?同步函数使用的锁就是this当前对象。
public synchronized void add(int num){//同步函数
sum = sum + num;
try {
Thread.sleep(1000);//这里我们让线程睡一秒钟,这样cpu时间片可以充分的切换到其他线程上
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("sum="+sum);
}
运行结果图:可以看到每过一秒钟,会输出一次结果

java多线程机制2(安全问题)的更多相关文章
- 处理java多线程时线程安全问题 - ThreadLocal和Synchronized
多线程在自动化测试中用的不多,也就是说我们用单线程可以完成大部分的自动化测试脚本. 主要有两个原因,首先是因为自动化测试首要考虑的是脚本的稳定性,所以一般会牺牲效率以保证脚本稳定,其次是由于局限于我们 ...
- JAVA 多线程机制(二)
主要内容 1.理解线程的并发性 2.线程的同步 3.线程的常用方法 上一章中由于线程的并发性导致了多线程的执行总是会出现一些问题..线程的并发性是程序员不可控制 的,也是不可避免的,线程的并发性往 ...
- JAVA 多线程机制(一)
PS:又开始忙叨JAVA了..前一阵子搞定了HTML+CSS,要开始写实验室的界面了,真没劲...博客到时候再更新吧! 先更新JAVA的吧... 多线程(一) 主要内容 1.JAVA中的线程 2.用T ...
- java 多线程:线程安全问题,示例DateFormat多线程执行冲突解决方案ThreadLocal、方法内变量
SimpleDateFormat多线程中执行报错 java.lang.NumberFormatException: For input string: "" import ja ...
- java多线程机制
多线程使用场景 1.同时需要做两件以上事情时需要开多个线程(例如:上传功能附带进度条显示,一边做上传,一边更新进度条状态.) 2.大量同类型数据需要进行处理(导入导出大量数据) 3.office文档转 ...
- java 多线程机制
Example12_1.java public class Example12_1 { public static void main(String args[]) { //主线程 SpeakElep ...
- java多线程机制1(线程创建的两种方式)
进程:正在运行的程序.(即程序在内存中开辟了一片空间) 线程:是进程的执行单元. 一个进程至少包含了一个多个线程. 多线程是不是可以提高效率:多线程可以合理的利用系统的资源,提高效率是相对的.因为cp ...
- java 多线程:线程安全问题synchronized关键字解决
背景: 多个线程同时修改一个变量时,有概率导致两次修改其中某些次被覆盖. 例如:如下案例一个变量值为3,三个线程同时对其-1,如果按顺序执行,每次减完的结果应该是2,1,0.但实际运行中有可能变为0, ...
- Java的多线程机制系列:(一)总述及基础概念
前言 这一系列多线程的文章,一方面是个人对Java现有的多线程机制的学习和记录,另一方面是希望能给不熟悉Java多线程机制.或有一定基础但理解还不够深的读者一个比较全面的介绍,旨在使读者对Java的多 ...
随机推荐
- Java 常用类String类、StringBuffer类
常用类 String类.StringBuffer类 String代表不可变的字符序列 "xxxxxxx"为该类的对象 举例(1) public class Test { publi ...
- 《我是一只it小小鸟》观后感
在这个学期开始的时候我们的老师推荐给我们这本书.在很多的网站上只要一提到IT,总会有人推荐这本书,我在读这本书之前看了很多关于它的书评,其中有一位网友的一句话让我对它产生了很大的兴趣:“印象最深的是书 ...
- 《IT小小鸟》读后感
我是来自大一的小小鸟,想要飞却没有一对坚硬的臂膀! 看了<IT小小鸟>了解了学长和学姐们的大学经历后开始让我反思我的大学生活.学长和学姐们通过自身的经历来告诉我们,应该怎么样规划好大学生涯 ...
- 《IT小小鸟》的阅读心得
新年过后我们迎来大一下学期,想想刚迈入大学的我们,充满着好奇与兴奋,仿佛就在昨天.时光飞逝而今,虽经过一学期的学习,仍对计算机专业充满困惑,对未来充满迷茫. 在我感到迷茫的时候,老师给我们介绍了这样的 ...
- 01_Java基础_第1天(Java概述、环境变量、注释、关键字、标识符、常量)_讲义
今日内容介绍 1.Java开发环境搭建 2.HelloWorld案例 3.注释.关键字.标识符 4.数据(数据类型.常量) 01java语言概述 * A: java语言概述 * a: Java是sun ...
- javascript之容易出错的地方
1: 不是所有的非空对象都有toString()方法的 var obj = Object.create(null); console.log(obj.toString()); // false; ...
- angularjs 常用功能练习
<!DOCTYPE html> <html ng-app="app"> <head> <meta charset="utf-8& ...
- android面试(5)---SQL数据库
SQL基础: 1.如何查询table1从20到30条记录: select * from table1 limit 19,11 2.替换id=1,name =deman的记录? replace into ...
- Lyft Level 5 Challenge 2018 - Elimination Round翻车记
打猝死场感觉非常作死. A:判一下起点和终点是否在其两侧即可. #include<iostream> #include<cstdio> #include<cmath> ...
- 一些兼容性的meta标签
<!-- 仅针对IOS的Safari顶端状态条的样式(可选default/black/black-translucent )--> <meta name="apple-mo ...