JAVA——多线程举例

同步函数用的是哪一个锁呢?
函数需要被对象调用。那么函数都有一个所属对象引用。就是this。所以同步函数使用的锁是this。

下面通过程序进行验证。

使用两个线程来买票。一个线程在同步代码块中。一个线程在同步函数中。都在执行买票动作。

class Ticket implements Runnable
{
    private  int ticket = 100;
    Object obj = new Object();
    boolean flag = true;
    public void run()
    {
        if(flag)
        {
            while(true)
            {
               synchronized(obj)
           {
                if(ticket>0)
                {
                    try
                    {
                       Thread.sleep(10);
                    }
                    catch(Exception e)
                    {

                    }
                                  System.out.println(Thread.currentThread().getName()+"---sale :"+ticket--);
                 } 
           } 
            }
        }
    else
    {
      while(true)
         show();
    }

    }

    public synchronized void show()
    {
    if(ticket>0)
    {
        try
        {
            Thread.sleep(10);
        }
        catch(Exception e)
        {

        }
          System.out.println(Thread.currentThread().getName()+"---sale :"+ticket--);
    }

    }
}


class TicketDemo1
{
    public static void main(String[] args)
    {
        Ticket t  = new Ticket();


        Thread t1  = new Thread(t);//创建了一个线程
        Thread t2  = new Thread(t);//创建了一个线程


        t1.start();
    try
    {
        Thread.sleep(10);
    }
    catch(Exception e)
    {

    }
    t.flag = false;
        t2.start();


    }
}

这里写图片描述
最后一行不是我们所希望看到的结果,试想同步的两个原则:

1、必须要有两个或者两个以上的线程。
2、必须使多个线程使用同一个锁。

显然第一个条件满足,第二个不满足。所以修改synchronized(obj)为synchronized(this);结果如下:
这里写图片描述

如果同步函数被静态修饰后,使用的锁是什么呢?
通过验证,发现不再是this,因为静态方法中也不可以定义this。
静态进内存中,内存中没有本类对象,但是一定有该类对应的字节码文件对象。
类名.class 该对象的类型是Class

class Ticket implements Runnable
{
    private static int ticket = 20;
    Object obj = new Object();
    boolean flag = true;
    public void run()
    {
        if(flag)
        {
            while(true)
            {
           synchronized(Ticket.class)
           {
                if(ticket>0)
                {
                    try
                {
                       Thread.sleep(10);
                    }
                    catch(Exception e)
                    {

                     }
                    System.out.println(Thread.currentThread().getName()+"---sale :"+ticket--);
                 } 
                    } 
            }
        }
    else
    {
      while(true)
         show();
    }

    }

    public static synchronized void show()
    {
    if(ticket>0)
    {
        try
        {
            Thread.sleep(10);
        }
        catch(Exception e)
        {

        }
          System.out.println(Thread.currentThread().getName()+"---sale :"+ticket--);
    }

    }
}


class TicketDemo1
{
    public static void main(String[] args)
    {
        Ticket t  = new Ticket();
        Thread t1  = new Thread(t);//创建了一个线程
        Thread t2  = new Thread(t);//创建了一个线程


        t1.start();
    try
    {
        Thread.sleep(10);
    }
    catch(Exception e)
    {

    }
    t.flag = false;
        t2.start();
    }
}

这里写图片描述
静态的同步方法,使用的锁是该方法所在类的字节码文件对象。类名.class

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值