线程状态图:

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

/*
* 线程安全问题
*
* 产生的原因:
* 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. Access连接数据源配置(新手必知)

    今天要连接Access时发现win7 64位旗舰版控制面板中管理工具下的数据源(ODBC)配置竟然只有SQLServer的驱动,其他的都没有了,这可不好玩!上网百度了一番,有人也遇过这样的问题,我在此 ...

  2. rabbitmqctl 的常用命令

    # 查看服务器的状态 rabbitmqctl status   # 查看环境变量 rabbitmqctl environment   # 停止rabbitmq的应用 rabbitmqctl stop_ ...

  3. 设计模式PHP篇(三)————装饰器模式

    简单的用php实现了装饰器模式: <?php /** *简单的装饰器模式 */ class PrintText { protected $decorators = []; public func ...

  4. FastReport.Net 无限页高(连续纸小票)

    using System; using System.Collections; using System.Collections.Generic; using System.ComponentMode ...

  5. Django之contenttypes的应用

    Django contenttypes 应用 简介 contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中. 每当我 ...

  6. Hibernate 中 load() 和 get() 的区别

    get 和 load 方式都是是根据 id 取得一个记录.下边详细说一下 get 和 load 的不同,因为有些时候为了对比也会把 find 加进来. 1.从返回结果上对比: load 方式检索不到的 ...

  7. webgl学习笔记一-绘图单点

    写在前面   WebGl(全称:Web Graphics Library : web图形库) 是基于OpenGL ES 2.0的3D绘图协议.   WebGL完美地解决了现有的Web交互式三维动画的两 ...

  8. JMeter脚本强化之检查点

    上一篇讲述了对脚本做参数化的两种方法,并对参数化设置结果做了简单的验证,就是通过添加断言.本篇将详细一点介绍怎么使用断言做文本检查,或者叫做设置检查点. 首先来看看下面的三个图,这三个图是用查看结果树 ...

  9. 第131天:移动web页面的排版与布局

    一.总之一句话, 尽量用mm 毫米作为标准单位. 采用新的相对单位 rem 首先设置html的 font-size 为根大小. html{ font-size:1mm; } .titleheight{ ...

  10. FZU2127_养鸡场

    题目的意思为要你求出满足三边范围条件且周长为n的三角形的数目. 其实做法是直接枚举最短边,然后就可以知道第二条边的取值范围,同时根据给定的范围缩小范围. 同时根据第二条边的范围推出第三条边的范围,再次 ...