`
grandboy
  • 浏览: 125202 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

由线程安全引起的一个有关Realm问题

    博客分类:
  • JAVA
阅读更多
我的项目里需要给Tomcat写一个 Realm,大家都知道Realm接口里简化如下:
public interface Realm {
    public Principal authenticate(String username, String credentials);
    ...
    public SecurityConstraint [] findSecurityConstraints(Request request, Context context);
    ...
}

   为了节省篇幅,把Realm接口简化了一下。 由于项目需要必须要在authenticate方法里使用request, 而通过摸索在Realm里只有findSecurityConstraints方法里能得到这个request. 于是我就写了Realm如下:
public class MyRealm extends JAASRealm {
    protected HttpServletRequest request;
    public Principal authenticate(String username, String credentials){
    //在这里使用request。
    }
    ...
    public SecurityConstraint [] findSecurityConstraints(Request request, Context context){
        this.request = request;
        return super.findSecurityConstraints(request, context);
    }
}


这样测试"良好", 似乎是可行的。 功能也都能过。
    但是高手一看就会发现问题,因为request对象是变化的,并且Realm在整个Tomcat里只有一个实例(至少在只配置一个Realm的时候是这样的,配置多个Realm我还没有试)。这样就导致了request方法对多线程不安全,甚至混乱。
    请高手帮着看一下:

1. 是不是有其他更好的办法在Realm访问request对象?
2. 如果第一个问题是否定的,看有没有办法使这个request安全的被访问?
(我知道用ThreadLocal来解决,还有没有其他办法)
请大家帮忙了。谢谢。
分享到:
评论
2 楼 grandboy 2008-09-13  
加锁,好像不能实现。因为加锁并不能阻止其他线程对变量进行修改。只能保证只有一个线程在同一时间内执行一个代码块,如果对authenticate与findSecurityConstraints方法同步的话也只能保证这两个方法不能同时执行。所以我想还是无法满足要求。
1 楼 kaneg 2008-09-09  
对所有用到request的方法加锁

相关推荐

    Realm Building Modern Swift Apps with Realm Database

    7. ** 多线程支持**:学习如何在多线程环境中安全地使用 Realm,包括读写分离和同步策略。 8. ** 延迟加载与缓存**:掌握 Realm 对大数据集的优化策略,如延迟加载和缓存技术,以提高性能。 9. ** 关系与链接**:...

    Android Realm数据库逻辑封装

    4. **线程安全**: Realm提供了内置的线程管理机制,使得在多线程环境中使用数据库更加安全。 5. **轻量级**: 相比于其他数据库,Realm的库文件小,对应用程序的大小影响较小。 6. **易于扩展**: Realm支持动态...

    Realm安卓eclipse0.87.5版本

    5. **线程安全**: Realm 在多线程环境中也表现出色,它自动处理了线程间的同步,确保在不同线程中访问 Realm 数据时不会出现数据冲突。 6. **查询语言**: Realm 提供了一个强大的查询语言,允许开发者进行复杂的...

    RealmDemo简单测试使用

    Realm是一款流行于移动开发领域的轻量级数据库,尤其在Android和iOS平台上被广泛采用。...在实践中,还可以进一步学习如何处理复杂的查询、事务管理、以及 Realm 的其他高级特性,如实时数据同步和线程安全。

    MacOS Realm

    Realm是一个现代、高性能的对象数据库,专为移动和桌面应用程序设计,包括iOS和MacOS平台。 Realm的核心优势在于它提供了简单易用的API,直接在应用程序内存中操作数据,极大地提升了开发效率和应用程序性能。 ### ...

    hiro之realm相关对象共14页.pdf.zip

    8. **Thread-Safety**: Realm 是线程安全的,但需要注意的是,同一个 Realm 实例不能同时在多个线程中使用。 RealmObject 和 RealmResults 也是线程绑定的,只能在创建它们的线程中使用。 从描述中我们可以推测,这...

    Rx 封装后的 Realm 库.zip

    5. **线程安全**: Realm 在内部处理了线程同步问题,RxRealm 则进一步确保在正确的线程上执行读写操作,避免了多线程环境下可能遇到的问题。 6. **数据绑定**:通过 RxSwift,可以轻松地将 Realm 数据绑定到 UI ...

    realm-java-0.86.0

    Realm Java 0.86.0 是该公司为Java开发者推出的一个特定版本,它包含了对Android和Java应用的数据存储功能的优化。这个版本的发布旨在提供稳定性和性能提升,同时也引入了新的特性和改进。 **核心特性** 1. **轻...

    Android-一个用于Stetho的Realm模块可以通过Stetho在Chrome浏览器上查看Realm数据库

    Realm是一个现代化的对象关系映射(ORM)库,专门针对Android设计,它提供了一个高效、安全且易于使用的数据库解决方案。与传统的SQLite相比,Realm提供了更流畅的API,支持实时数据,以及在内存中和磁盘上的无缝...

    shiro-realm案例

    Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用。在"shiro-realm案例"中,我们将探讨如何自定义Realm来实现与应用程序特定的权限验证。 ...

    Realm使用Demo

    Realm是一个现代、高性能的数据库解决方案,尤其适用于移动平台,如Android和iOS。它提供了原生对象持久化,使得数据管理更加简单高效。在这个“Realm使用Demo”中,我们将深入探讨如何在Android应用程序中使用Realm...

    Realm_Building_Modern_Swift_Apps_with_Realm_Database_v1.0

    Realm提供了一个简单易用的API,使得开发者能够快速集成并处理复杂的数据结构。通过阅读本书,开发者不仅能够学习到如何将Realm集成到Swift项目中,还能了解到最佳实践和高级技巧。 #### 三、核心知识点详解 #####...

    前端开源库-realm-create

    总的来说,`realm-create` 是一个强大的前端工具,它帮助开发者在JavaScript环境中创建和管理独立的代码执行领域,提高了代码的安全性和模块化程度。了解并熟练使用 realm-create,可以提升你的前端开发能力,解决...

    Android的Realm数据库增删改查实例

    在Android应用开发中, Realm是一个流行且高效的本地对象关系映射(ORM)数据库,它提供了比SQLite更简单、更快捷的API。 Realm数据库允许开发者直接在内存中操作数据,极大地提高了应用程序的性能和用户体验。本...

    Android-RealmAssetHelper-用于将Realm.IO集成在Android应用工具类

    在这个名为"Android-RealmAssetHelper"的项目中,我们找到了一个工具类,帮助开发者更方便地在Android应用中集成Realm.IO。 集成Realm.IO通常涉及以下几个步骤: 1. **添加依赖**:首先,你需要在项目的build....

    RealmThread:一个ActionTask消息泵,用于在专用Realm线程上运行命令

    ## SushiHangover.RealmThread 一个动作/任务消息泵,用于在专用领域线程上运行命令。GitHub回购 ## API文档 ## Nuget: Install-Package SushiHangover.RealmThread Nuget.org: ##有问题吗? 在Github上发布##...

    Realm数据库使用

    Realm 是线程安全的,每个线程应有自己的 Realm 实例。 4. **插入数据**:通过实例化的 Realm 对象,使用 `insert()` 或 `save()` 方法将对象写入数据库。 5. **查询数据**:使用 RealmQuery 对象构建查询条件,...

    swift-EasyRealm是一个帮助您使用Realm的微框架

    在Swift开发中, Realm是一个流行的对象关系映射(ORM)库,它提供了一种简单的方式来存储和管理应用程序的数据。Realm数据库不同于传统的SQL数据库,它是一种NoSQL、基于磁盘的持久化存储解决方案,设计时充分考虑...

    Realm 是一个移动数据库SQLite 和 ORM 的替代品.zip

    Realm 是一个可直接在手机、平板电脑或可穿戴设备内运行的移动数据库。此存储库包含 Realm Java 版本的源代码,目前仅在 Android 上运行。领域 KotlinRealm Kotlin SDK现已正式发布,可用于 Android 和 Kotlin ...

    realm-java.zip

    "realm-java.zip" 是一个与 Realm Java 相关的压缩包文件,Realm 是一个流行的对象关系映射(ORM)框架,专为移动平台设计,尤其是Android和iOS。 Realm 提供了一个本地数据库解决方案,使得开发者可以方便地存储和...

Global site tag (gtag.js) - Google Analytics