首页 > 编程语言 >JAVA 线程安全案例

JAVA 线程安全案例

时间:2023-06-16 21:55:17浏览次数:33  
标签:JAVA thread Thread 案例 线程 thread2 new public

# 线程安全案例

## 使用原子类来实现资源的安全保护

```java

public class AtomicSafeExample {

static CountDownLatch countDownLatch = new CountDownLatch(2);



public static void main(String[] args) throws InterruptedException {

Thread thread = new Thread(Performance.INSTANCE , "thread-1");
Thread thread2 = new Thread(Performance.INSTANCE , "thread-2");

// 模拟耗时
Thread.sleep(200);

thread.start();
thread2.start();

// 方式一
// try {
// // 使用 join 进行 thread 和 thread2 的阻塞操作
// thread.join();
// thread2.join();
// }catch (InterruptedException e) {
// }

// 方式二 使用 CountDownLatch

try {
countDownLatch.await();
}catch (InterruptedException e) {

}

System.out.println(Performance.INSTANCE.nums);

}

static enum Performance implements Runnable {

INSTANCE;
AtomicInteger nums = new AtomicInteger(0);

@Override
public void run() {
for (int i = 0 ; i < 100 ; i ++ ) {
nums.incrementAndGet();
}
countDownLatch.countDown();
}
}
}

```

1、Java中的原子类可以使用CAS(Compare And Swap)算法来实现线程安全

2、使用原子类可以简化多线程编程,提高程序的性能和可维护性。如果需要进行线程安全的计数操作、状态标记等,可以考虑使用Java中的原子类。

## ReentrantLock 实现线程安全

```java

public class ReentrantLockSafeExample {

static int nums = 0;

public static void main(String[] args) {
Thread thread = new Thread(Performance.INSTANCE , "thread-1");
Thread thread2 = new Thread(Performance.INSTANCE , "thread-2");

thread.start();
thread2.start();

try {
thread.join();
thread2.join();
}catch (InterruptedException e) {

}

System.out.println(nums);

}

enum Performance implements Runnable {
INSTANCE;

static ReentrantLock lock = new ReentrantLock();

@Override
public void run() {
lock.lock();
try {
for (int i = 0 ; i < 200 ; i ++) {
nums ++ ;
}
}finally {
lock.unlock();
}

}
}

}

```

1、ReentrantLock是Java中的一个可重入锁,它可以用于实现线程间的互斥和同步。

2、使用 ReentrantLock 的基本范式

```java

public void m() {
lock.lock(); // block until condition holds
try {
// ... method body
} finally {
lock.unlock()
}
}

```

1、ReentrantLock需要手动释放锁,因此一定要在finally块中调用unlock方法,以确保锁能够被正确释放。

2、使用ReentrantLock可以避免死锁和饥饿等多线程问题,同时提供了更高的灵活性和可扩展性,是Java多线程编程中常用的工具之一。

---

## 使用 synchronized 实现线程安全

```java

public class Counter { private int count; // 使用synchronized实现线程同步 public synchronized void increment() { count++; } public int getCount() { return count; } } public class MyThread extends Thread { private Counter counter; public MyThread(Counter counter) { this.counter = counter; } @Override public void run() { for (int i = 0; i < 10000; i++) { counter.increment(); } } } public class Main { public static void main(String[] args) throws InterruptedException { Counter counter = new Counter(); MyThread thread1 = new MyThread(counter); MyThread thread2 = new MyThread(counter); thread1.start(); thread2.start(); thread1.join(); thread2.join(); System.out.println(counter.getCount()); // 输出20000 } }

```

1、synchronized 是 Java 中的关键字,可以用于实现线程间的同步和互斥。使用 synchronized 可以保证在多线程环境下的线程安全性,避免了数据竞争和不一致的问题。

2、synchronized 是一种重量级锁,会对性能产生一定的影响。在使用 synchronized 时,应尽可能减少同步的范围和时间,避免出现死锁和饥饿等多线程问题。

标签:JAVA,thread,Thread,案例,线程,thread2,new,public
From: https://www.cnblogs.com/ayizzz/p/17486586.html

相关文章

  • Java类加载原理中为何要设计双亲委派机制
    首先,给大家演示两个示例代码,我们自定义一个与Java核心类库中java.lang.String类名相同的代码:packagejava.lang;/***自定义java.lang.String类**@author编程老司机*@date2023-06-16*/publicclassString{static{System.out.println("加载自......
  • java课设——《RookieSuperMario》【菜鸟版超级玛丽
    项目简介:我们团队利用面向对象开发方法和Javaswing框架,对经典游戏《SuperMario》进行编写。此项目共设施三个关卡,玩家可通过键盘来控制马里奥的移动,跳跃可以顶掉砖块,下落时还可以踩死蘑菇敌人,如果马里奥最终安全到达堡垒,则通关成功。个人项目负责任务: 创建背景类(BackGroun......
  • 多线程
    多线程线程介绍每个进程都会有一个主线程,在创建进程时创建,往后创建的线程都属于子线程;线程在进程里不断抢占运行时间片;当进程遇到return结束,所有的线程全部结束。线程分类线程主要分为用户级线程和内核级线程用户级线程主要解决上下文切换问题,其调度由用户控制内核级线程......
  • java基于springboot+vue的网吧管理系统,附源码+数据库+论文+PPT,适合课程设计、毕业设计
    1、项目介绍随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,网吧管理系统就是信息时代变革中的产物之一。任何系统都要遵循系统设计的基......
  • JAVA JVM 层面的锁
    JVM锁1、JAVA为了实现在多线程环境灰姑娘下的线程安全,提供了诸如synchronized,ReentrantLock等工具类来解决我们在多线程环境下的线程安全问题。synchronized锁1、上面是synchronized锁synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:修饰一个代......
  • javaScript核心知识点
      一、JavaScript简介       一、JavaScript语言的介绍:JavaScript是基于对象和原型的一种动态、弱类型的脚本语言       二、JavaScript语言的组成:JavaScript是由核心语法(ECMAScript)、文档对象模型(DOM)、浏览器对象模型(BOM)组成的       三......
  • 多线程
    1.进程和线程的定义进程:引用程序的执行实例(一个应用对应一个进程)线程:CPU调用和分派的基本单元,进程中执行运算的最小单位2.创建线程的种类继承java.lang.Thread类实现java.lang.Runnable接口3.继承java.lang.Thread类(1)定义MyThread类继承Thread类(2)重写run()方法,编写线程......
  • 关于js单线程的问题
    为什么说js是单线程?为了搞清楚这个问题,我们需要先了解这几个问题:什么是线程?什么是进程?他们之间的关系?什么是任务队列(EventQueue),任务分类(宏任务、微任务)?什么是事件循环?为什么说js是单线程?为什么js要是单线程?接下来我们一起来看一下:什么是线程?什么是进程?他......
  • Chrome 禁用 javascript
    步骤1.打开控制台:右键>检查2.在控制台页面快捷键ctrl+shift+p然后输入javascript找到disabledjavaScript.解除禁用: ctrl+shift+p然后输入enablejavaScript找到enablejavaScrip. ......
  • tween.js简单案例
    ‘init(); animate(); functioninit(){ varoutput=document.createElement('div'); output.style.cssText='position:absolute;left:50px;top:300px;font-size:100px'; document.body.appendChild(output); v......