Java互斥锁简单实例

 更新时间:2015年07月11日 10:10:56   作者:优雅先生  
这篇文章主要介绍了Java互斥锁,较为详细的分析了java互斥锁的概念与功能,并实例描述了java互斥锁的原理与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了Java互斥锁。分享给大家供大家参考。具体分析如下:

互斥锁,常常用于多个线程访问独占式资源,比如多个线程同时写一个文件,虽然互斥访问方式不够高效,但是对于一些应用场景却很有意义

//没有互斥锁的情况(可以自己跑跑看运行结果):
public class LockDemo {
 
// private static Object lock = new Object();
// static确保只有一把锁
  private int i = 0;
  public void increaseI() {
//   synchronized (lock) {
      for(int k=0;k<10;k++) { // 对i执行10次增1操作
        i++;
      }
      System.out.println(Thread.currentThread().getName() + "线程,i现在的值:" + i);
//   }
  }
  public static void main(String[] args) {
    LockDemo ld = new LockDemo();
    int threadNum = 1000;
    // 选择1000个线程让结果更加容易观测到
    MyThread[] threads = new MyThread[threadNum];
    for(int i=0;i<threads.length;i++) {
      threads[i] = new MyThread(ld);
      // 所有线程共用一个LockDemo对象
      threads[i].start();
    }
  }
}
class MyThread extends Thread {
  LockDemo ld;
   
  public MyThread(LockDemo ld) {
    this.ld = ld;
  }
  public void run() {
    ld.increaseI();
  }
}
//加上互斥锁以后:
public class LockDemo {
  private static Object lock = new Object();
  // static确保只有一把锁
  private int i = 0;
  public void increaseI() {
    synchronized (lock) {
      for(int k=0;k<10;k++) {
      // 对i执行10次增1操作
        i++;
      }
      System.out.println(Thread.currentThread().getName() + "线程,i现在的值:" + i);
    }
  }
  public static void main(String[] args) {
    LockDemo ld = new LockDemo();
    int threadNum = 1000;
    // 选择1000个线程让结果更加容易观测到
    MyThread[] threads = new MyThread[threadNum];
    for(int i=0;i<threads.length;i++) {
      threads[i] = new MyThread(ld);
      // 所有线程共用一个LockDemo对象
      threads[i].start();
    }
  }
}
class MyThread extends Thread {
  LockDemo ld;
  public MyThread(LockDemo ld) {
    this.ld = ld;
  }
  public void run() {
    ld.increaseI();
  }
}

希望本文所述对大家的java程序设计有所帮助。

相关文章

  • Springboot使用test无法启动问题的解决

    Springboot使用test无法启动问题的解决

    这篇文章主要介绍了Springboot使用test无法启动问题的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • springboot DTO字符字段与日期字段的转换问题

    springboot DTO字符字段与日期字段的转换问题

    这篇文章主要介绍了springboot DTO字符字段与日期字段的转换问题,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • SpringBoot项目的测试类实例解析

    SpringBoot项目的测试类实例解析

    这篇文章主要介绍了SpringBoot项目的测试类实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • spring 或者spring boot 调整bean加载顺序的方式

    spring 或者spring boot 调整bean加载顺序的方式

    这篇文章主要介绍了spring 或者spring boot 调整bean加载顺序的方式,本文通过实例代码讲解三种调整类加载顺序的方式,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • 详解Java面向对象中的继承

    详解Java面向对象中的继承

    这篇文章主要介绍了详解Java面向对象中的继承,继承提高代码的复用性:通过继承,子类可以直接使用父类的属性和方法,不需要重复定义,需要的朋友可以参考下
    2023-05-05
  • Java中的@Async异步功能详解

    Java中的@Async异步功能详解

    这篇文章主要介绍了Java中的@Async异步功能详解,@Async注解,可以实现异步处理的功能,它可以有返回值,或者直接在新线程时并行执行一个任务,对于异步来说,它的执行是有条件的,你需要把异步代码块放在单独的类里,需要的朋友可以参考下
    2023-11-11
  • 解决SpringBoot application.yaml文件配置schema 无法执行sql问题

    解决SpringBoot application.yaml文件配置schema 无法执行sql问题

    这篇文章主要介绍了解决SpringBoot application.yaml文件配置schema 无法执行sql问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 关于java.lang.NumberFormatException: null的问题及解决

    关于java.lang.NumberFormatException: null的问题及解决

    这篇文章主要介绍了关于java.lang.NumberFormatException: null的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • SpringBoot使用Validation包进行输入参数校验

    SpringBoot使用Validation包进行输入参数校验

    Spring Boot 自带的 spring-boot-starter-validation 包支持以标准注解的方式进行输入参数校验,本文即关注 spring-boot-starter-validation 包所涵盖的标准注解的使用、校验异常的捕获与展示、分组校验功能的使用,以及自定义校验器的使用,需要的朋友可以参考下
    2024-05-05
  • Java中的HashMap和Hashtable区别解析

    Java中的HashMap和Hashtable区别解析

    这篇文章主要介绍了Java中的HashMap和Hashtable区别解析,HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的区别,主要的区别有线程安全性、同步和速度,需要的朋友可以参考下
    2023-11-11

最新评论