java 多线程安全问题-同步代码块
- /*
- 多线程的安全问题:
- while(true)
- {
- if(tick>0)
- {
- //线程0,1,2,3在余票为1时,都停滞在这里,之后分别获得CPU执行权,打印出0,-1,-2等错票
- System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--);
- }
- }
- 问题的原因:
- 当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行一部分,还没有执行完,停滞
- 另一个线程参与进来执行,导致共享数据错误。
- 解决办法:
- 对多条操作共享数据的语句块,进行限制,每次只允许一个线程执行,执行完毕后,再运行其它线程执行
- ----
- java对于多线程的安全问题提供了专业的解决方式
- 同步代码块:
- synchronized(对象)
- {
- 需要同步的代码
- }
- (个人理解锁:锁就是一个不停在0,1变化的标志位,根据真假判断可选择是否进入操作区域。操作系统中的元量知识
- 对象就类似标志位
- 初始时为1,当线程进入后首先使标志位自减为0
- 假设此时线程停滞了,由于标志位为0,其他线程也进不来
- 当线程唤醒执行完毕后,又将标志位置1,允许别的进程进入
- )
- 类似火车上的卫生间: 有人(1) 无人(0)
- 对象如同锁。持有锁的线程可以在同步中执行
- 没有持有锁的线程即使获得CPU的执行权,也无法进入,因为没有获取锁
- -----
- 同步的前提:
- 1. 必须要有两个或者两个以上的线程
- 2. 必须是多个线程使用同一个锁
- 必须保证同步中只能有一个线程在执行
- ---
- 同步机制
- 好处:解决了多线程的安全问题
- 弊端:多个线程每次都要判断锁,较为消耗资源
- */
- class Ticket implements Runnable
- {
- private int ticket =1000;
- Object obj = new Object(); //使用上帝创建对象
- public void run()
- {
- while(true)
- {
- synchronized(obj)
- {
- if(ticket>0)
- {
- System.out.println(Thread.currentThread().getName()+"....余票可卖数 : "+ ticket--);
- }
- }
- }
- }
- }
- class TecketDemo2
- {
- public static void main(String[] args)
- {
- Ticket t =new Ticket();
- Thread t1= new Thread(t);
- Thread t2= new Thread(t);
- Thread t3= new Thread(t);
- Thread t4= new Thread(t);
- t1.start();
- t2.start();
- t3.start();
- t4.start();
- System.out.println("Hello World!");
- }
- }
java 多线程安全问题-同步代码块的更多相关文章
- java学习笔记 --- 多线程(线程安全问题——同步代码块)
1.导致出现安全问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 2.解决线程安全问题方法: 同步代码块: synchronized(对象){ 需要同步的代码; ...
- java多线程安全问题-同步修饰符于函数
上一篇文章通过卖票使用同步代码块的方法解决安全问题本篇文章首先探讨如何找出这样的安全问题,并提出第二种方式(非静态函数synchronized修饰)解决安全问题 /* 需求: 银行有一个公共账号金库 ...
- Java多线程同步代码块
/*多线程的安全问题1.为什么会出现安全问题?因为程序在运行时,会出现一个线程在判断条件满足后,具备了执行资格,但没有运行代码后一个线程也判断了条件,也具备了执行资格,后一个线程运行了代码,但这时候, ...
- JAVA之旅(十三)——线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this
JAVA之旅(十三)--线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this 我们继续上个篇幅接着讲线程的知识点 一.线程的安全性 当我们开启四个窗口(线程 ...
- -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中
本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait( ...
- Java之同步代码块处理继承Thread类的线程安全问题
package com.atguigu.java; /** *//** * 使用同步代码块解决继承Thread类的方式的线程安全问题 * * 例子:创建三个窗口卖票,总票数为100张.使用继承Thre ...
- Java之同步代码块处理实现Runnable的线程安全问题
/** * 例子:创建三个窗口卖票,总票数为100张.使用实现Runnable接口的方式 * * 1.问题:卖票过程中,出现了重票.错票 -->出现了线程的安全问题 * 2.问题出现的原因:当某 ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- [java多线程] - 锁机制&同步代码块&信号量
在美眉图片下载demo中,我们可以看到多个线程在公用一些变量,这个时候难免会发生冲突.冲突并不可怕,可怕的是当多线程的情况下,你没法控制冲突.按照我的理解在java中实现同步的方式分为三种,分别是:同 ...
随机推荐
- 【python】matplotlib在windows下安装
昨晚装了好久的这玩意,终于在凌晨成功搞定,然后跑起了一个人人网抓取好友关系的脚本~开心. 以下是我参考的最给力的文档,全部安装一遍,就可以啦~ 但是!在安装前一定要先确认自己的python版本!本人自 ...
- iOS 代码实现获得应用的版本号(Version/Build)
http://www.open-open.com/lib/view/open1411817778203.html
- LPC1788 nand驱动
Lpc 1788自带有emc接口用于驱动nandflash,norflash,sdram设备,对于nandflash驱动因为配置简单,时序也简单 首先,针对nandflash而言应当在系统中有三个地址 ...
- android 后台服务定时通知
最近有个项目的要求是在程序退出之后,任然可以每天定时发通知,我们可以想下,其实就是后台开一个服务,然后时间到了就发下通知. 1.首先我们需要用到Service类. 先上代码在慢慢解释 package ...
- mongodb 导入数据库文件
吐槽一下: 这个导入现有数据文件弱爆了... 直接将要导入的数据文件放到mongodb下的db目录下就完事了...O(∩_∩)O哈哈~ 例如: 将shop_suning (shopdb_suning ...
- CSS3 Transitions 你可能不知道的知识点
如何临时让transition失效 我们给一个element设置了transition效果,但某些特殊情况,我们希望让transition临时失效.我们第一反应就是先移除transition设置,等其 ...
- iOS workspace 依次编译多个工程
目的:当我封装一个framework的时候,需要检验当前的改动,但是又不想编译完framework,又要编译测试工程. 步骤: 1. 选择测试工程 2. Edit Scheme 3. 选中Build- ...
- IOS 利用图片设置背景
UIImageView* imageView = [[UIImageView alloc] initWithFrame:self.view.bounds]; imageView.image = [UI ...
- 让win7安装时出现版本选项
win7有几种版本,win7旗舰版包含各大版本,修改一下ISO,让安装时出现版本选项窗口: 1.准备好一个官方win7旗舰版安装包IOS光盘镜像. 2.用UltraISO打开光盘镜像并删除source ...
- FB面经 Prepare: Task Schedule
tasks has cooldown time, give an input task id array, output finish time input: AABCA A--ABCA output ...