/*多线程的安全问题
1.为什么会出现安全问题?
因为程序在运行时,会出现一个线程在判断条件满足后,具备了执行资格,但没有运行代码
后一个线程也判断了条件,也具备了执行资格,后一个线程运行了代码,但这时候,线程运行的条件不满足了
这时候,就出现了安全问题

2.实现接口线程的方法不能抛出异常!

*/

/*运行情况
通过分析,发现,打印出0,-1,-2等错票。

多线程的运行出现了安全问题

问题的原因?
  当多条语句在操作同一线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完
  另一个线程参与进来,导致共享数据错误
 
解决办法
  对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其它线程不参与执行。
 
Java对于多线程的安全问题提供了专业的解决方式
就是同步代码块
格式:
    synchronized(对象)  对象可以随意(使用上帝就行)
    {
        需要被同步的代码(哪些代码在操作共享数据)
    }
    
对象如同锁,持有锁的线程可以在同步中执行
没有持有锁的线程即便获取cpu的执行权,也进不去,因为没有获取权

同步的前提:
1.必须要有两个或者两个以上
2.必须是多个线程使用同一个锁

必须保证同步中只能有一个线程在运行

好处:解决了多线程的安全问题

弊端:多个线程需要判断锁,较为消耗资源
*/

class Ticket implements Runnable //extends Thread
{
    object obj=new object();
    private static int tick=100;
    public void run()              /*不能在这写同步函数,否则其它线程用不了,需要单独写一个同步函数*/
    {
        while(true)
        {   synchronized(obj)
            {
                if(tick>0)
                {
                    try
                    {
                        Thread.sleep(10);   /*每次运行就沉睡一下*/
                    }
                    catch(Exception e)
                    {
                        
                    }
                    System.out.println(Thread.currentThread().getName()+"sale:--"+tick--);
                }
            }
          }
    }
}

class TicketDemo
{
    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();
    }
}

转载于:https://www.cnblogs.com/liangqiyuan/p/5660284.html

Java多线程同步代码块相关推荐

  1. java synchronized块_Java多线程同步代码块Synchronized

    Java多线程同步代码块Synchronized Java中的每个对象都有一个与之关联的内部锁(Intrinsic lock). 这种锁也称为监视器(Monitor), 这种内部锁是一种排他锁,可以保 ...

  2. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  3. 多线程(同步代码块和同步函数)

    线程安全问题 当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,     另一个线程参与进来执行.导致共享数据的错误. 解决办法:     对多条操作共享数据的语句 ...

  4. 黑马毕向东Java课程笔记(day11):多线程(第一部分)——进程与线程+线程创建+线程安全与同步代码块+同步锁/死锁

    多线程好文:添加链接描述 锁机制:synchronized.Lock.Condition.volatile(原子性可见性)--参考添加链接描述 1.进程与线程概述   首先,对于CPU执行每一个程序, ...

  5. [java多线程] - 锁机制同步代码块信号量

    在美眉图片下载demo中,我们可以看到多个线程在公用一些变量,这个时候难免会发生冲突.冲突并不可怕,可怕的是当多线程的情况下,你没法控制冲突.按照我的理解在java中实现同步的方式分为三种,分别是:同 ...

  6. Java中多线程、多线程的实现方式、同步代码块的方式

    多线程 进程 线程 概念 目前的程序是单线程 线程的组成部分 代码实现多线程的方式 第一种方式 第二种方式 第三种方式 -- 线程池 第四种方式:Callable 线程状态 线程同步 临界资源 原子操 ...

  7. 编程开发之--java多线程学习总结(2)同步代码块

    1.第一种解决办法:同步代码块,关键字synchronized package com.lfy.ThreadsSynchronize;/*** 1.使用同步代码块* 语法:synchronized ( ...

  8. java多线程实现卖火车票小案例同步代码块优先级守护线程

    /***  *   * @author 时光机jay  * @version 1.8  * @since 2020/9/28  *   * */ public class Test33 {     s ...

  9. java同步方法完成案例_Java同步代码块和同步方法原理与应用案例详解

    本文实例讲述了java同步代码块和同步方法.分享给大家供大家参考,具体如下: 一 点睛 所谓原子性WOmoad:一段代码要么执行,要么不执行,不存在执行一部分被中断的情况.言外之意是这段代码就像原子一 ...

最新文章

  1. Kotlin一大特色之空安全
  2. Filter和Listener-学习笔记01【Filter 快速入门】
  3. Invitation Cards POJ - 1511 SPFA(dijkstra+反向建图+邻接表(下标过大)+输入输出用stdio(iostream超时))
  4. 7-1 模拟EXCEL排序 (25 分)
  5. 面试官爱问的10大经典排序算法,20+张图来搞定
  6. 前端-requests-flask对应关系 restful
  7. 线段树的入门级 总结
  8. 一说起丁克,我们普遍的认知就是,不生孩子
  9. Spoon工具使用(kettle进行实时同步数据)
  10. 笔记本计算机信号不强,增强笔记本WiFi无线信号的方法
  11. python sqrt(4)*sqrt(9)_Python表达式sqrt(4)*sqrt(9)的值为__________。
  12. CF898D. Alarm Clock(贪心 双指针)
  13. PHP开发微信小程序的经验总结
  14. 全球哪儿找工作最容易? 新加坡居榜首香港排第九
  15. PM_08 十大管理之项目质量管理(五)
  16. 电气器件系列二十五:电子式压力传感器PPG-D(2)
  17. 逝者已逝,愿生者坚强
  18. perl-dbd-mysql qt_perl 安装DBI和DBD
  19. python简单网页爬虫代码
  20. 计算机专业术语表白,围观!看各专业都怎么用术语表白的!

热门文章

  1. 下载和安装Nginx之添加Nginx作为系统服务(CentOS7为例)
  2. 剪贴板所有api函数
  3. position:relative 与 position:absolute
  4. 为什么建议使用Linux?从“白嫖”到精通,只需要这几步
  5. jquery ajax php获取,使用jquery ajax获取php结果
  6. Redis AOF带来的问题
  7. ArrayBlockingQueue原理分析-dequeue方法
  8. Spring Cloud 版本支持
  9. 通过反射越过泛型检查
  10. RocketMQ的核心概念讲解