Java多线程的临界资源问题的解决方法

发布时间:2021-10-15 15:56:15 作者:柒染
来源:亿速云 阅读:127

Java多线程的临界资源问题的解决方法,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

临界资源问题的原因:某一个线程在对临界资源进行访问时,还没来得及完全修改临界资源的值,临界资源就被其他线程拿去访问,导致多个线程访问同一资源。直观表现为打印结果顺序混乱。

解决方法:加锁

静态方法中用类锁,非静态方法中用对象锁。

1.同步代码段:synchronized(){...}

2.同步方法:使用关键字synchronized修饰的方法

3.使用显式同步锁ReentrantLock

锁池描述的即为锁外等待的状态

方法一:同步代码段:synchronized(){...}

public class SourceConflict {  public static void main(String[] args) {    //实例化4个售票员,用4个线程模拟4个售票员        Runnable r = () -> {      while (TicketCenter.restCount > 0) {        synchronized(" ") {          if (TicketCenter.restCount <= 0) {            return;          }          System.out.println(Thread.currentThread().getName() + "卖出一张票,剩余" + --TicketCenter.restCount + "张票");        }      }    };        //用4个线程模拟4个售票员    Thread thread1 = new Thread(r, "thread-1");    Thread thread2 = new Thread(r, "thread-2");    Thread thread3 = new Thread(r, "thread-3");    Thread thread4 = new Thread(r, "thread-4");        //开启线程    thread1.start();    thread2.start();    thread3.start();    thread4.start();      }  }//实现四名售票员共同售票,资源共享,非独立//Lambda表达式或匿名内部类内部捕获的局部变量必须显式的声明为 final 或实际效果的的 final 类型,而捕获实例或静态变量是没有限制的class TicketCenter{  public static int restCount = 100; }

方法二:同步方法,即使用关键字synchronized修饰的方法

public class SourceConflict2 {  public static void main(String[] args) {    //实例化4个售票员,用4个线程模拟4个售票员        Runnable r = () -> {      while (TicketCenter.restCount > 0) {        sellTicket();      }    };        //用4个线程模拟4个售票员    Thread thread1 = new Thread(r, "thread-1");    Thread thread2 = new Thread(r, "thread-2");    Thread thread3 = new Thread(r, "thread-3");    Thread thread4 = new Thread(r, "thread-4");        //开启线程    thread1.start();    thread2.start();    thread3.start();    thread4.start();      }    private synchronized static void sellTicket() {      if (TicketCenter.restCount <= 0) {      return;    }    System.out.println(Thread.currentThread().getName() + "卖出一张票,剩余" + --TicketCenter.restCount + "张票");  }}class TicketCenter{  public static int restCount = 100; }

方法三:使用显式同步锁ReentrantLock

import java.util.concurrent.locks.ReentrantLock;public class SourceConflict3 {  public static void main(String[] args) {    //实例化4个售票员,用4个线程模拟4个售票员        //显式锁    ReentrantLock lock = new ReentrantLock();    Runnable r = () -> {      while (TicketCenter.restCount > 0) {        lock.lock();        if (TicketCenter.restCount <= 0) {          return;        }        System.out.println(Thread.currentThread().getName() + "卖出一张票,剩余" + --TicketCenter.restCount + "张票");        lock.unlock();      }    };        //用4个线程模拟4个售票员    Thread thread1 = new Thread(r, "thread-1");    Thread thread2 = new Thread(r, "thread-2");    Thread thread3 = new Thread(r, "thread-3");    Thread thread4 = new Thread(r, "thread-4");        //开启线程    thread1.start();    thread2.start();    thread3.start();    thread4.start();      }  }class TicketCenter{  public static int restCount = 100; }

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

推荐阅读:
  1. zabbix 相关问题的解决方法
  2. 05.java多线程问题

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:如何解决spring无法读取properties文件数据问题

下一篇:SpringBoot如何通过redisTemplate调用lua脚本并打印调试信息到redislog

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》