ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

第三章同步与锁

2021-08-05 22:01:40  阅读:145  来源: 互联网

标签:同步 第三章 Thread 张数 抢到 线程 买票 资源


1,线程安全问题

先看个例子:

package com.shanghai;

public class ThreadDemo implements Runnable{
    private  int ticket =  5 ;

    @Override
    public void run() {
        for(int i=1;i<=5;i++){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
//            ticket--;
            
System.out.println("线程资源:"+i+"抢到买票张数:"+ticket--);
        }
    }

    public static void main(String[] args) {
        ThreadDemo  dd = new ThreadDemo();
        new Thread(dd).start();
        new Thread(dd).start();
        new Thread(dd).start();
//        new Thread(dd).start();
    }
}

其中一次的结果:


线程资源:1抢到买票张数:5
线程资源:1抢到买票张数:4
线程资源:1抢到买票张数:5
线程资源:2抢到买票张数:3
线程资源:2抢到买票张数:3
线程资源:2抢到买票张数:2
线程资源:3抢到买票张数:0
线程资源:3抢到买票张数:1
线程资源:3抢到买票张数:1
线程资源:4抢到买票张数:-3
线程资源:4抢到买票张数:-1
线程资源:4抢到买票张数:-2
线程资源:5抢到买票张数:-5
线程资源:5抢到买票张数:-4
线程资源:5抢到买票张数:-6
 

以上结果不做说明,每次运行结果都不一样,有兴趣的伙伴可以自测。

但是 通过以上自测结果我们可以看出,起的多个线程对同一资源使用时会有竞争关系,要想让票个张数一张一张减少,用多线程模拟多用户买票处理那就需要同步了,同步是什么,是指同一时间段内只有一个线程运行。

以上代码 

测试启动一个线程

  public static void main(String[] args) {
        ThreadDemo  dd = new ThreadDemo();
        new Thread(dd).start();
//        new Thread(dd).start();
//        new Thread(dd).start();
//        new Thread(dd).start();
    }

结果如下:

线程资源:1抢到买票张数:5
线程资源:2抢到买票张数:4
线程资源:3抢到买票张数:3
线程资源:4抢到买票张数:2
线程资源:5抢到买票张数:1

要想多线程使用如单线程使用那样 ,就需要在一个时间段内锁着需要执行的部分。

一般有同步代码块和同步方法两种方式

这就用到了一个关键字锁:synchronized

代码片段如:

for(int i=1;i<=5;i++){
            synchronized (this) {
                if(ticket>0) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
//            ticket--;
                    System.out.println("线程资源:" + i + "抢到买票张数:" + ticket--);
                }
            }
        }

结果如下:

线程资源:1抢到买票张数:5
线程资源:2抢到买票张数:4
线程资源:3抢到买票张数:3
线程资源:4抢到买票张数:2
线程资源:5抢到买票张数:1

使用加载到同步方法上的如下:

for(int i=1;i<=5;i++){

    this.getResult(i);

}

 public synchronized  void getResult(int jj){
        if(ticket>0) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
//            ticket--;
            System.out.println("线程资源:" + jj + "抢到买票张数:" + ticket--);
        }
    }

结果如下:

线程资源:1抢到买票张数:5
线程资源:2抢到买票张数:4
线程资源:3抢到买票张数:3
线程资源:4抢到买票张数:2
线程资源:5抢到买票张数:1

以上是通过加synchorized关键字达到的效果。但是有一种情况会让这同步造成都相互等待问题。那这个是什么情况呢?敬请期待。

标签:同步,第三章,Thread,张数,抢到,线程,买票,资源
来源: https://blog.csdn.net/zhangxiaopihai_xujia/article/details/119192313

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有