多线程(1_锁的认识_2_死锁分析)

我们创建4个线程,与之前不同的是,同时使用了同步函数和同步代码快。看看结果如何

class Mlpc implements Runnable
{
    private int ticket = 550;
    public boolean flag = true;
    Object obj = new Object();
    public void run()
    {
        if(flag == true)
        {
            while(true)
            {
                synchronized (obj)
                {
                    if(ticket>0)
                    {
                        if(ticket>0)
                        {
                            try
                            {
                                Thread.sleep(20);
                            }
                            catch (Exception e)
                            {
                            }
                            System.out.println(Thread.currentThread()+" show "+ticket--);
                        }
                    }
                }
            }
        }
        else
        {
            while(true)
            {
                show();
            }
        }

    }
    public synchronized void show()
    {

            if(ticket>0)
            {
                try
                {
                    Thread.sleep(20);
                }
                catch (Exception e)
                {
                }
                System.out.println(Thread.currentThread()+" show "+ticket--);
            } 

    }
}

 class mlpcDemo
{
    public static void main(String[] args)
    {

        Mlpc m = new Mlpc();
        Thread th0 = new Thread(m);
        Thread th1 = new Thread(m);
        Thread th2 = new Thread(m);
        Thread th3 = new Thread(m);

        th0.start();
        try
        {
            Thread.sleep(20);
        }
        catch (Exception e)
        {
        }
        m.flag = false;
        th1.start();
        th2.start();
        th3.start();
    }
}

结果出现了票数为0。

 public void run()
    {
        if(flag == true)
        {
            while(true)
            {
               synchronized (this) //从原本的任意对象改为函数自己所属的对象this               {
                    if(ticket>0)
                    {
                        try
                        {
                            Thread.sleep(20);
                        }
                        catch (Exception e)
                        {
                        }
                        System.out.println(Thread.currentThread()+" show "+ticket--);
                    }
                }
            }
        }
        else
        {
            while(true)
            {
                show();
            }
        }

    }

时间: 2024-09-29 17:11:02

多线程(1_锁的认识_2_死锁分析)的相关文章

JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序员杜鹏程的博客:http://blog.csdn.net/m366917 我们来继续学习多线程 Lock锁的使用 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock Lock void lock():获取锁 v

JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是class对象 我们在上节验证了同步函数的锁是this,但是对于静态同步函数,你又知道多少呢? 我们做一个这样的小实验,我们给show方法加上static关键字去修饰 private static synchronized void show() { if (tick > 0) { try { Thread

分析SIX锁和锁分区导致的死锁

什么是SIX锁? 官方文档锁模式中说到: 意向排他共享 (SIX):保护针对层次结构中某些(而并非所有)低层资源请求或获取的共享锁以及针对某些(而并非所有)低层资源请求或获取的意向排他锁. 顶级资源允许使用并发 IS 锁. 例如,获取表上的 SIX 锁也将获取正在修改的页上的意向排他锁以及修改的行上的排他锁. 虽然每个资源在一段时间内只能有一个 SIX 锁,以防止其他事务对资源进行更新,但是其他事务可以通过获取表级的 IS 锁来读取层次结构中的低层资源. 官方说明比较晦涩难懂,我尝试用一种易懂的

一个最不可思议的MySQL死锁分析

一个最不可思议的MySQL死锁分析 死锁问题背景 做MySQL代码的深入分析也有些年头了,再加上自己10年左右的数据库内核研发经验,自认为对于MySQL/InnoDB的加锁实现了如指掌,正因如此,前段时间,还专门写了一篇洋洋洒洒的文章,专门分析MySQL的加锁实现细节:<MySQL加锁处理分析>. 但是,昨天"润洁"同学在<MySQL加锁处理分析>这篇博文下咨询的一个MySQL的死锁场景,还是彻底把我给难住了.此死锁,完全违背了本人原有的锁知识体系,让我百思不得

SQL Server锁分区特性引发死锁解析

原文:SQL Server锁分区特性引发死锁解析 锁分区技术使得SQL Server可以更好地应对并发情形,但也有可能带来负面影响,这里通过实例为大家介绍,分析由于锁分区造成的死锁情形. 前段时间园友@JentleWang在我的博客锁分区提升并发,以及锁等待实例中问及锁分区的一些特性造成死锁的问题,这类死锁并不常见,我们在这里仔细分析下.不了解锁分区技术的朋友请先看下我的锁分区那篇实例. Code(执行测试脚本时请注意执行顺序,说明) 步骤1 创建测试数据 use tempdb go creat

innodb之死锁分析:读和删造成的死锁

一个例子的死锁分析: 环境:innodb引擎,RC隔离级别; 死锁信息: RECORD LOCKS space id 0 page no 1492482 n bits 904 index `unit_id` of table `51fshenzhen`.`t_refresh_queue` trx id EB9C4A64 lock_mode X locks rec but not gap 表如下: CREATE TABLE `t_refresh_queue` ( `refresh_queue_id

sqlite3 多线程和锁 ,优化插入速度及性能优化

一. 是否支持多线程? SQLite官网上的“Is SQLite threadsafe?”这个问答. 简单来说,从3.3.1版本开始,它就是线程安全的了.而iOS的SQLite版本没有低于这个版本的,当然,你也可以自己编译最新版本. 不过这个线程安全仍然是有限制的,在这篇<Is SQLite thread-safe?>里有详细的解释.另一篇重要的文档就是<SQLite And Multiple Threads>.它指出SQLite支持3种线程模式: 单线程:禁用所有的mutex锁,

第十六章——处理锁、阻塞和死锁(3)——使用SQLServer Profiler侦测死锁

原文:第十六章--处理锁.阻塞和死锁(3)--使用SQLServer Profiler侦测死锁 前言: 作为DBA,可能经常会遇到有同事或者客户反映经常发生死锁,影响了系统的使用.此时,你需要尽快侦测和处理这类问题. 死锁是当两个或者以上的事务互相阻塞引起的.在这种情况下两个事务会无限期地等待对方释放资源以便操作.下面是死锁的示意图: 本文将使用SQLServer Profiler来跟踪死锁. 准备工作: 为了侦测死锁,我们需要先模拟死锁.本例将使用两个不同的会话创建两个事务. 步骤: 1. 打

第十六章——处理锁、阻塞和死锁(2)——侦测阻塞和阻塞查询

原文:第十六章--处理锁.阻塞和死锁(2)--侦测阻塞和阻塞查询 前言: 如果一个事务正在等待一些给其他事务锁定的资源.这个事务就被成为"被阻塞的事务".反过来,引起阻塞的事务,也就是锁定资源并造成其他事务等待的事务叫做"正在阻塞的事务". 长时间运行事务会阻塞其他事务和查询,使他们等待长时间.在繁重的系统中,很多时候我们会遇到阻塞问题,如果一个事务因为阻塞未完成.会造成一些列的等待链. 本文将介绍如何发现并马上解决这方面的问题. 准备工作: 本例依旧使用SQLSe