专栏首页禁心尽力如何使用线程锁来提高多线程并发效率

如何使用线程锁来提高多线程并发效率

       今天对synchronized关键字的用法又有了更高一层的理解,特此记录一下。

       一直对自己设计的多通道做单不是狠满意,并发效率低下。因为之前使用的锁一直是对象锁(this/类.class),这样则意味着每个线程抢到CPU执行权之后就会把整个类锁住,然后执行完被同步的全部代码后才释放锁,后面的线程才能执行同步代码,导致并发效率低下。还有一个问题就是:假如在某一时刻把整个类都锁住,那么这时在其他地方调用被锁住的这个类的其他方法,则要等到释放锁后才能调用。

模拟多窗口售票系统:

 1 /**
 2  * 多线程售票案例:
 3  */
 4 public 
 5 class SellTicket {
 6     
 7     private static final Logger logger = LoggerFactory.getLogger(SellTicket.class);
 8     
 9     public static void main(String[] args) {
10         MyThread unit = new MyThread();    //售票线程单元
11         //六个售票窗口开始同时售票5000张
12         logger.info("开始售票:{}=======================");
13         new Thread(unit,"【窗口一】").start();
14         new Thread(unit,"【窗口二】").start();
15         new Thread(unit,"【窗口三】").start();
16         new Thread(unit,"【窗口四】").start();
17         new Thread(unit,"【窗口五】").start();
18         new Thread(unit,"【窗口六】").start();
19     }
20 }
21 
22 /**
23  * 创建线程单元:一个线程单元模拟一个售票窗口进行售票,每执行一次售出票数+1。
24  */
25 class MyThread implements Runnable{
26     
27     private static Object lock = new Object();    //静态锁
28     private int votes = 1;        //日预售票数起点
29     
30     //售票
31     @Override
32     public void run() {
33         while(true){
34                 //1、用lock静态所把锁的粒度缩小,提高并发效率。
35             //2、synchronized (MyThread.class): 把整个类锁住,这样很糟糕并且效率低下。比如调用其他方法,也要等得到锁才能继续做。
36         synchronized (lock) {        //同步锁:保证在同一时刻最多只有一个线程单元进行售票
37                 if (votes > 5000) {    
38                     //日票数已售完
39                     break;
40                 }
41                 System.out.println(Thread.currentThread().getName()+"成功预订"+votes+"票");
42                 votes++;
43             }
44         }
45     }
46 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JavaSE高级之集合类

    ​下面的内容是对java中的集合类进行的总结,过段时间会分享java的网路编程,多线程等内容,欢迎批评指正。 1.Java中的集合是用来存放对象的,即集合是对象...

    lizelu
  • Java基本语法练习

    1.编写程序,求100以内的全部素数。 实验源码: public class FirstClass { public static void main(St...

    lizelu
  • 安利这15个编程小游戏,边玩边学!

    这年头,不学点编程都不敢出门。学习编程的方法有太多,比如编程类教科书,在线互动课程,线上编程指导等。其中,最有趣的就是编程类游戏。今天,Uni酱就来谈谈:那些可...

    企鹅号小编
  • JDBC与JAVA数据库编程

    一、JDBC的概念 1、 JDBC (Java DataBase Connectivity) Java数据库连接     a) 主要提供java数据库应用程序...

    lizelu
  • kotlin web开发教程【一】从零搭建kotlin与spring boot开发环境

    IDEA中文输入法的智能提示框不会跟随光标的问题 我用的开发工具是IDEA image.png 这个版本的IDEA有一个问题; 就是中文输入法的智能提示框不...

    liulun
  • Java中的多线程

    1、 线程中的主要方法     a) isAlive() 判断线程是否还活着,即线程是否未终止     b) getPriority() 获得线程的优先级   ...

    lizelu
  • java在acm中大数运算教程

    import java.io.*; import java.util.*; public class Main { public static void ...

    triplebee
  • Java中的网络编程

    ​  Java中的网路编程主要是Java的Socket编程,属于JavaEE中的高级的部分,以下内容是对java网路编程的一个小结,代码都是经过编译调试的   ...

    lizelu
  • JavaSE高级之GUI编程

     下面主要用到了java中的swing进行界面设计,当然java的GUI不如C#的设计的好看,不过原理还是要会的。 1. GUI Graphical User ...

    lizelu
  • 写好Java代码的30条经验总结

    无可厚非你是一名程序员,但你真的是一个优秀的程序员吗?答案可不一定了。想要成为一个优秀的程序员,有着良好的代码编写习惯是必不可少的。下面就让我们来看看Java代...

    企鹅号小编

扫码关注云+社区

领取腾讯云代金券