Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >防止在多线程上下文中使用非线程安全方法

防止在多线程上下文中使用非线程安全方法
EN

Stack Overflow用户
提问于 2012-07-31 16:05:38
回答 4查看 349关注 0票数 7

当用户试图在多线程上下文中使用类的非线程安全方法时,有没有办法抛出异常?我猜问题主要是检测到多个线程正在尝试使用该方法。或者,有没有可以在函数声明中使用的"not_synchronous“关键字/标记?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-31 16:07:53

没有简单的方法可以做到这一点,不。如果您检测到多个线程正在使用一个方法,那么很有可能您必须使用线程安全集合等。如果你正在做所有这些事情,那么你可能不得不让方法本身成为线程安全的。

票数 2
EN

Stack Overflow用户

发布于 2012-07-31 16:18:37

在允许线程运行该方法之前,您可以检查该方法是否已在使用中--但这与使用锁没有太大区别(注意:我的示例不是可重入的):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static final AtomicBoolean used = new AtomicBoolean();

public static void unsafe() throws InterruptedException {
    if(!used.compareAndSet(false, true)) {
        throw new IllegalStateException();
    }
    //do you stuff
    used.set(false);
}
票数 3
EN

Stack Overflow用户

发布于 2012-07-31 16:22:00

对Gray的回答进行扩展:假设您想这样做(检测一个方法何时正被多个线程使用)。一个简单的(不正确的)实现可能如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
volatile boolean methodBeingUsed = false;
public void doSomething() {
  if (methodBeingUsed) throw new IllegalStateException("You can't do that!");
  try {
    methodBeingUsed = true;
    // do something...
  } finally {
    methodBeingUsed = false;
  }
}

好吧,好吧..。但是两个线程可以同时通过第一次if (methodBeingUsed)检查并进入临界区。因此,现在我们可以尝试添加一个锁来保护methodBeingUsed标志:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Lock methodLock = new ReentrantLock();
volatile boolean methodBeingUsed = false;
public void doSomething() {
  try {
    lock.lock();
    if (methodBeingUsed) throw new IllegalStateException("You can't do that!");
    methodBeingUsed = true;
  } finally {
    lock.unlock();
  }

  try {
    // do something...
  } finally {
    try {
      lock.lock();
      methodBeingUsed = false;
    } finally {
      lock.unlock();
    }
  }
}

当然,这假设doSomething()不能递归地调用自身。如果可以,那么您还必须跟踪调用线程。添加更多的检查,以说明我现在没有考虑到的其他情况,很容易看出,花在同步逻辑上的精力来检测多线程正在使用的方法,最好从一开始就让方法是线程安全的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11744392

复制
相关文章
Java 非线程安全的HashMap如何在多线程中使用
Java 非线程安全的HashMap如何在多线程中使用 HashMap 是非线程安全的。在多线程条件下,容易导致死循环,具体表现为CPU使用率100%。因此多线程环境下保证 HashMap 的线程安全性,主要有如下几种方法: 使用 java.util.Hashtable 类,此类是线程安全的。 使用 java.util.concurrent.ConcurrentHashMap,此类是线程安全的。 使用 java.util.Collections.synchronizedMap() 方法包装 HashMap
nnngu
2018/03/15
1.9K0
Java 非线程安全的HashMap如何在多线程中使用
在多线程处理任务中,防止线程过度竞争
对于后台的多线程处理任务,通常采取以下几种优化措施来防止线程过度竞争导致的性能下降:
一凡sir
2023/08/24
4560
多线程---线程安全
一、思考:线程安全产生的原因是什么? 二、final,volatile关键字的作用? 三、1.5之前的javaDCL有什么缺陷? 四、如何编写线程安全的程序? 五、ThreadLocal使用的注意事项有哪些?
用户9854323
2022/06/25
6050
多线程---线程安全
[Java]Java多线程数据安全(同步线程的方法)
原创文章,欢迎转载。转载请注明:转载自 祥的博客 原文链接:http://blog.csdn.net/humanking7/article/details/43541387
祥知道
2020/03/10
4700
多线程 以及 线程安全
进程: APP 启动时,应用会启动一个新的 Linux 进程, 一个app内可以有多个进程,进程之间不共享数据。 线程: 1个进程中可以包含多个线程,线程之间数据共享。
艳龙
2021/12/16
4070
多线程 以及 线程安全
java 多线程线程安全
在多线程中使用共享资源,对共享资源的操作不是原子性,就会导致数据不一致的情况 例如 : index ++ 操作 index ++ 实际上相当于 1. index + 1 2. 将结果赋值 index
Tim在路上
2020/08/04
8060
多线程之线程安全
   线程是越多越好吗?答案否,线程太多的话,会造成CPU频繁的切换反而会造成很多线程处于等待状态。除了浪费资源和效率之外,多线程带来的其他风险:安全、死锁等 比如下面程序:
OPice
2019/10/23
6010
多线程 里面 使用AtomicInteger类,保证线程安全
假设我们的网站要统计用户人数,我们需要通过变量的自增来实现:count++; 这个操作存在线程安全问题:
一写代码就开心
2022/08/03
9040
Java多线程——多线程方法详解
从结果可知:Mythread的构造方法是被main线程调用的,而run方法是被名称为Thread-0的线程调用的,run方法是线程自动调用的
说故事的五公子
2019/11/26
9710
多线程线程安全问题
其实Thread和Runnable都实现了run方法,这种操作模式其实就是代理模式
用户1518699
2019/04/18
5350
多线程线程安全问题
WPF 设置资源字典多线程安全读写方法
在 WPF 中,使用 ResourceDictionary 本身不会受到创建线程同步影响,意味着可以在任意的线程创建 ResourceDictionary 资源字典,然后在任意线程使用。但是此时的读写需要有时间上的差距,否则将会多线程读写不安全。在 ResourceDictionary 有一个 CanBeAccessedAcrossThreads 属性用来决定在进行读写的时候是否加上锁,但这个属性是内部的,需要通过黑科技更改才能用上
林德熙
2020/11/27
5970
使用CompletionService非阻塞获取多线程返回值
Future接口是Java标准API的一部分,在java.util.concurrent包中。Future接口是Java线程Future模式的实现,可以来进行异步计算。 有了Future就可以进行三段式的编程了,1.启动多线程任务2.处理其他事3.收集多线程任务结果。从而实现了非阻塞的任务调用。在途中遇到一个问题,那就是虽然能异步获取结果,但是Future的结果需要通过isdone来判断是否有结果,或者使用get()函数来阻塞式获取执行结果。这样就不能实时跟踪其他线程的结果状态了,所以直接使用get还是要慎用,最好配合isdone来使用。 有一种更好的方式来实现对任意一个线程运行完成后的结果都能及时获取的办法:使用CompletionService,它内部添加了阻塞队列,从而获取future中的值,然后根据返回值做对应的处理。
神秘的寇先森
2018/09/29
1.8K0
Java多线程实战:多线程方法详解
从结果可知:Mythread的构造方法是被main线程调用的,而run方法是被名称为Thread-0的线程调用的,run方法是线程自动调用的
田维常
2019/11/28
8360
Java多线程实战:多线程方法详解
非线程安全对象�
今天的微博有人讨论到对象池,我想到之前项目的实现,应该用模板来实现啊,唉,还是被前人的想法给框定了,只是实现一个特别简单,花了几分钟写了个:
全栈程序员站长
2022/07/12
2510
从执行上下文角度重新理解.NET(Core)的多线程编程[3]:安全上下文
在前两篇文章(《基于调用链的”参数”传递》和《同步上下文》)中,我们先后介绍了CallContext(IllogicalCallContext和LogicalCallContext)、AsyncLocal<T>和SynchronizationContext,它们都是线程执行上下文的一部分。本篇介绍的安全上下文(SecurityContext)同样是执行上下文的一部分,它携带了的身份和权限相关的信息决定了执行代码拥有的控制权限。
蒋金楠
2020/12/01
5730
从执行上下文角度重新理解.NET(Core)的多线程编程[3]:安全上下文
Java多线程之单例模式在多线程环境下的安全问题
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
用户7886150
2020/12/15
1.8K0
多线程快速入门与多线程与线程安全问题(多线程实战【二】)
多线程同时对同一个全局变量做写的操作,可能会受到其他 线程的干扰,就会发生线程安全性问题。 全局变量----java内存结构 什么是写操作------修改
高大北
2022/06/14
3080
多线程快速入门与多线程与线程安全问题(多线程实战【二】)
笔记 35 | java线程之线程安全与非线程安全
地址 CSDN http://blog.csdn.net/xiangyong_1521/article/details/78541142 ---- 线程安全与非线程安全 ArrayList和Vecto
项勇
2018/06/19
6210
使用jedis面临的非线程安全问题
网上都说jedis实例是非线程安全的,常常通过JedisPool连接池去管理实例,在多线程情况下让每个线程有自己独立的jedis实例,但都没有具体说明为啥jedis实例时非线程安全的,下面详细看一下非线程安全主要从哪个角度来看。
小勇DW3
2020/08/12
3.2K0
使用jedis面临的非线程安全问题
在多线程中使用spring的bean
在多线程中使用spring的bean可以方便地使用spring管理的配置文件,以便于更好地使用spring框架。通过封装spring提供工具,可以手动获得spring管理的bean,以便于多线程环境中的使用。同时,xml中配置很关键,需要使用spring加载时感知,否则无法获取到spring管理的bean。
杉枫
2017/12/26
7830

相似问题

在多线程上下文中安全使用映射中的引用

11

在多线程上下文中的断言()安全性

30

如何使方法在多线程上下文中独占?

811

使用非线程安全CIFilter的多线程

10

在多线程上下文中卸载Mono域

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文