线程状态图:

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

/*
* 线程安全问题
*
* 产生的原因:
* 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();@Overridepublic void run() {//每个储户往银行循环存三次钱,每次100for (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);}

运行结果图:可以看到每过一秒钟,会输出一次结果

转载于:https://www.cnblogs.com/zhouxuan323/p/5175120.html

java多线程机制2(安全问题)相关推荐

  1. 浅谈Java多线程机制

    浅谈Java多线程机制 (-----文中重点信息将用红色字体凸显-----) 一.话题导入 在开始简述Java多线程机制之前,我不得不吐槽一下我国糟糕的IT界技术分享氛围和不给力的互联网技术解答深度. ...

  2. Java实用教程笔记 Java多线程机制

    Java多线程机制 泛型要考,后来又说不考了 多线程不考 12.1 进程与线程Process and Thread 12.2Java中的线程Threads in Java 线程的状态与生命周期The ...

  3. java显示多个地区时钟_妙用Java多线程机制实现多个时区时钟显示

    妙用Java多线程机制实现多个时区时钟显示 [摘要]在许多公共场合下,需要提供时钟显示,如机场.火车站.汽车站.酒店等,特别是一些需要接待外宾的场所,处理显示本地区时间以外还必须显示其他时区时间.本文 ...

  4. Java多线程之线程安全问题

    ⭐️前面的话⭐️ 本篇文章介绍的内容为Java多线程中的线程安全问题,此处的安全问题并不是指的像黑客入侵造成的安全问题,线程安全问题是指因多线程抢占式执行而导致程序出现bug的问题.

  5. java多线程【线程安全问题】

    (一)问题描述         我们 先通过代码案例看线程执行过程中会发生那些安全问题 模拟电影院卖票: 某电影院目前正在上映国产大片,共有100张票,而它有3个平台卖票,请设计一个程序模拟该电影院卖 ...

  6. (Java多线程)线程安全问题

    文章目录 线程安全 定义 售票模拟案例 注意 线程同步 同步代码块 同步方法 Lock锁 线程安全 定义 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果 ...

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

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

  8. Java多线程(详细了解java多线程机制)

    每天进步一点点 一.程序.进程.线程 1.1 什么是程序 1.2 什么是进程 1.3 什么是线程 1.4 进程和线程的区别 二.创建线程的三种方式 2.1 继承Thread类重写run()方法 具体实 ...

  9. java多线程机制计时器_java多线程定时器与单例模式

    定时器与单例模式 本次更新的主要内容是多线程中的定时器Timer和单例模式,本来打算分两次更新的,这次就在一起更新了.这次更新完之后,多线程的基础理论知识系列就完结了,后续会发布Mysql的内部技术分 ...

最新文章

  1. c 与java 反射性能_谈谈Java 反射的快慢
  2. 用好 Git 和 SVN,轻松驾驭版本管理
  3. 通过JDBC连接取得数据库相关的元数据
  4. 打散算法的三种解决方案及其选型场景
  5. 马云:未来无工可打,人工智能发展红利还在10年以后
  6. 如何使用HTML,CSS和JavaScript构建技巧计算器
  7. python怎么变各种颜色_python – 如何淡化颜色
  8. c语言中如何存储日志,C语言解析日志,存储数据到伯克利DB
  9. 使用原理视角看 Git
  10. 天翼短信 java_中国电信天翼开放平台自定义短信验证码和模板短信demo
  11. (2) 怎么学习IFC (Industry Foundation Class)
  12. star法则java简历_在简历中使用STAR法则
  13. 基于JavaWeb网上商城(以卖书为主)
  14. linux搭建stm32开发环境
  15. linux scl,scl命令
  16. Xshell 的安装与使用
  17. s盒密码c语言源代码csdn,AES中S盒的c语言实现及代码
  18. 壁纸 | iOS 14 内置这几张壁纸,你喜欢吗?
  19. c++ 虚函数多态、纯虚函数、虚函数表指针、虚基类表指针详解
  20. 【数据结构】迷宫问题实现(包含界面)

热门文章

  1. hadoop 023.0与hadoop 1.0 io.serializable分析
  2. 虚方法、重写方法和抽象方法[转载]
  3. 宁波城市职业技术学院Linux,宁波城市职业技术学院拟聘用人员公示
  4. linux挂载硬盘简书,linux|挂载硬盘及分区
  5. comsol线圈不能加电流激励_为什么电压互感器不能短路,电流互感器不得开路?...
  6. CCS初学调试以及RTDX
  7. Vivado使用误区与进阶——如何读懂用好 Timing Report
  8. 编程珠玑第二章习题答案
  9. 2010年10月VB100测试成绩
  10. numpy shape函数