博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程同步代码块
阅读量:6441 次
发布时间:2019-06-23

本文共 1195 字,大约阅读时间需要 3 分钟。

/*多线程的安全问题

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

你可能感兴趣的文章
学习新 api 的思考过程 4.18
查看>>
想要设计自己的微服务?看这篇文章就对了
查看>>
[译] 原生 JavaScript 值得学习吗?答案是肯定的
查看>>
29岁了还一事无成是人生的常态?
查看>>
gRPC-rs:从 C 到 Rust
查看>>
Mysql-高性能索引
查看>>
chrome浏览器最小字号解决方案
查看>>
富文本编译器UEditor+SSM的使用
查看>>
Java EE之旅02 CSS基础
查看>>
kubernetes学习笔记 (二):k8s初体验
查看>>
swift3 0 流控制
查看>>
Data-Mediator专题之属性回调
查看>>
每天一个Linux命令之ps-查看系统进程信息
查看>>
图解JavaScript原型链继承
查看>>
用VIPER构建iOS应用
查看>>
Java开源诊断工具 Arthas 发布v3.1.0
查看>>
什么是以太坊
查看>>
高效开发者是如何个性化VS Code插件与配置的?
查看>>
Java日志那些事
查看>>
117. Populating Next Right Pointers in Each Node II
查看>>