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://pwwzsj.com/article/hhhcg.html