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

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

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


分享名称:Java多线程的临界资源问题的解决方法
文章转载:http://cdiso.cn/article/jhsscj.html

其他资讯