线程状态图:

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

/*
* 线程安全问题
*
* 产生的原因:
* 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(安全问题)的更多相关文章

  1. 处理java多线程时线程安全问题 - ThreadLocal和Synchronized

    多线程在自动化测试中用的不多,也就是说我们用单线程可以完成大部分的自动化测试脚本. 主要有两个原因,首先是因为自动化测试首要考虑的是脚本的稳定性,所以一般会牺牲效率以保证脚本稳定,其次是由于局限于我们 ...

  2. JAVA 多线程机制(二)

    主要内容 1.理解线程的并发性 2.线程的同步 3.线程的常用方法   上一章中由于线程的并发性导致了多线程的执行总是会出现一些问题..线程的并发性是程序员不可控制 的,也是不可避免的,线程的并发性往 ...

  3. JAVA 多线程机制(一)

    PS:又开始忙叨JAVA了..前一阵子搞定了HTML+CSS,要开始写实验室的界面了,真没劲...博客到时候再更新吧! 先更新JAVA的吧... 多线程(一) 主要内容 1.JAVA中的线程 2.用T ...

  4. java 多线程:线程安全问题,示例DateFormat多线程执行冲突解决方案ThreadLocal、方法内变量

    SimpleDateFormat多线程中执行报错 java.lang.NumberFormatException: For input string: ""   import ja ...

  5. java多线程机制

    多线程使用场景 1.同时需要做两件以上事情时需要开多个线程(例如:上传功能附带进度条显示,一边做上传,一边更新进度条状态.) 2.大量同类型数据需要进行处理(导入导出大量数据) 3.office文档转 ...

  6. java 多线程机制

    Example12_1.java public class Example12_1 { public static void main(String args[]) { //主线程 SpeakElep ...

  7. java多线程机制1(线程创建的两种方式)

    进程:正在运行的程序.(即程序在内存中开辟了一片空间) 线程:是进程的执行单元. 一个进程至少包含了一个多个线程. 多线程是不是可以提高效率:多线程可以合理的利用系统的资源,提高效率是相对的.因为cp ...

  8. java 多线程:线程安全问题synchronized关键字解决

    背景: 多个线程同时修改一个变量时,有概率导致两次修改其中某些次被覆盖. 例如:如下案例一个变量值为3,三个线程同时对其-1,如果按顺序执行,每次减完的结果应该是2,1,0.但实际运行中有可能变为0, ...

  9. Java的多线程机制系列:(一)总述及基础概念

    前言 这一系列多线程的文章,一方面是个人对Java现有的多线程机制的学习和记录,另一方面是希望能给不熟悉Java多线程机制.或有一定基础但理解还不够深的读者一个比较全面的介绍,旨在使读者对Java的多 ...

随机推荐

  1. CSU 1808: 地铁 最短路

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1808 1808: 地铁 Time Limit: 5 SecMemory Limit: ...

  2. vue-cli配置axios,并基于axios进行后台请求函数封装

    文章https://www.cnblogs.com/XHappyness/p/7677153.html已经对axios配置进行了说明,后台请求时可直接this.$axios直接进行.这里的缺点是后端请 ...

  3. php面试必知必会常见问题

    1 说出常用的10个数组方法 我觉得数组比较最能体现PHP基础语法的一个数据结构了,下面给大家列一下常用的10个关于操作数组的函数 in_array(判断数组中是否有某个元素) implode(将数组 ...

  4. 反向代理负载均衡-----nginx

    一:集群 1.1:集群的概念    集群是一组相互独立的.通过高速网络互联的计算机,他们构成了一个组,并以单一系统的模式加以管理.一个客户与集群相互作用时,集群像是一个独立的服务器.集群配置是用于提高 ...

  5. Spring 学习 5- task 定时任务

    Spring-Task 1.这是网上的: 后面是我自己的配置 Spring3.0以后自主开发的定时任务工具,spring task,可以将它比作一个轻量级的Quartz,而且使用起来很简单,除spri ...

  6. 【codevs1163】访问艺术馆 树形dp

    题目描述 皮尔是一个出了名的盗画者,他经过数月的精心准备,打算到艺术馆盗画.艺术馆的结构,每条走廊要么分叉为二条走廊,要么通向一个展览室.皮尔知道每个展室里藏画的数量,并且他精确地测量了通过每条走廊的 ...

  7. 洛谷P1602 Sramoc问题 题解报告【同余+bfs】

    题目描述 话说员工们整理好了筷子之后,就准备将快餐送出了,但是一看订单,都傻眼了:订单上没有留电话号码,只写了一个sramoc(k,m)函数,这什么东西?什么意思?于是餐厅找来了资深顾问团的成员,YQ ...

  8. [JSOI2009]瓶子和燃料

    Description jyy就一直想着尽快回地球,可惜他飞船的燃料不够了. 有一天他又去向火星人要燃料,这次火星人答应了,要jyy用飞船上的瓶子来换.jyy 的飞船上共有 N个瓶子(1<=N& ...

  9. 【分块,莫队】【P4396】【AHOI2013】作业

    传送门 Description 此时己是凌晨两点,刚刚做了Codeforces的小A掏出了英语试卷.英语作业其实不算多,一个小时刚好可以做完.然后是一个小时可以做完的数学作业,接下来是分别都是一个小时 ...

  10. 关于JBoss基本说明文档及基本使用安装

    关于JBoss JBoss是全世界开发者共同努力的成果,一个基于J2EE的开放源代码的应用服务器.在不  到12个月的时间里有一百万以上的拷贝被下载.JBoss是第一位的J2EE应用服务器.    J ...