线程状态图:

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

/*
* 线程安全问题
*
* 产生的原因:
* 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. C#高级编程 (第六版) 学习 第四章:继承

    第四章 继承 1,继承的类型 实现继承: 一个类派生于一个基类型,拥有该基类型所有成员字段和函数. 接口继承 一个类型只继承了函数的签名,没有继承任何实现代码.   2,实现继承 class MyDe ...

  2. [学习]WireShark 的过滤功能

    1. 打开 wireShark 过滤显示 协议 比如显示arp协议 过滤栏输入arp即可 支持的协议类型 TCP UDP HTTP FTP ICMP SMTP等等 2. 过滤ip地址 ip.addr ...

  3. 【PHP】session失效时间

    最近用到php中session时,忽然发现php中的session有点让人头疼啊,要设置一个严格的特定时间内过期的session还真不太容易!后来在网上查询时,发现这个问题还真是有点普遍,网上也有关于 ...

  4. [翻译]Android官方文档 - 通知(Notifications)

    翻译的好辛苦,有些地方也不太理解什么意思,如果有误,还请大神指正. 官方文档地址:http://developer.android.com/guide/topics/ui/notifiers/noti ...

  5. java 使用volatile实现线程数据的共享

    java 使用volatile实现线程数据的共享 直接上代码看效果: public class VolatileTest extends Thread { private volatile boole ...

  6. 第113天:Ajax跨域请求解决方法

    一.原生JS实现ajax 第一步获得XMLHttpRequest对象 第二步:设置状态监听函数 第三步:open一个连接,true是异步请求 第四部:send一个请求,可以发送一个对象和字符串,不需要 ...

  7. Hadoop基于Protocol Buffer的RPC实现代码分析-Server端--转载

    原文地址:http://yanbohappy.sinaapp.com/?p=110 最新版本的Hadoop代码中已经默认了Protocol buffer(以下简称PB,http://code.goog ...

  8. 51nod 1624 取余最短路(set)

    题意: 佳佳有一个n*m的带权矩阵,她想从(1,1)出发走到(n,m)且只能往右往下移动,她能得到的娱乐值为所经过的位置的权的总和. 有一天,她被下了恶毒的诅咒,这个诅咒的作用是将她的娱乐值变为对p取 ...

  9. 【JavaScript】table显示问题

    table有时显示出问题,解决办法如下: 添加<thead></thead>和<tbody></tbody>在table的外面添加<div> ...

  10. 题解 P1888 【三角函数】

    堆排序万岁! 小金羊又来水题了 #include <iostream> #include <queue> using namespace std; priority_queue ...