网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

Java多线程的临界资源问题的解决方法-创新互联

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

创新互联公司是专业的垦利网站建设公司,垦利接单;提供成都网站设计、成都做网站,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行垦利网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

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

解决方法:加锁

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

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; }

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联网站建设公司,的支持。


名称栏目:Java多线程的临界资源问题的解决方法-创新互联
转载源于:http://bjjierui.cn/article/hhhcg.html

其他资讯