- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我当前的应用程序使用对象的单个实例作为许多主要组件的全局变量,据我所知,这不如使用依赖注入(inject)。
我希望将来让我的应用程序开源,但首先我想重构代码以使用最推荐的团队协作技术,以便其他开发人员能够更轻松地更改我的源代码。
共享资源示例:在 CFML 语言中,您有服务器作用域,它是可用于整个服务器实例的任何请求的共享内存。
这是我管理服务器范围变更的新设计理念:
这是管理需要锁定以实现线程安全的共享资源(共享内存、文件系统等)的最佳方式吗?
请描述可用于管理在某些被认为是最佳实践的某些读/写操作期间需要锁定的共享资源的任何其他方法。
编辑:基于已接受的答案,我将使用命名锁而不是锁定 scope="server",并使用更细粒度的锁定来管理共享资源。这可能允许使用多个对象来管理共享资源,假设它们都管理共享内存中的不同 key 或文件系统中的文件。例如,一个应用程序可以有自己的唯一键或分配给它的目录,这样它就不会与另一个试图更改共享资源的应用程序发生冲突。
Edit2:我发现如果我在创建对象时将范围传递给 init 函数,我可以为每个范围使用一个名为 scope.cfc 的组件。我现在正在使用细粒度的命名锁。让我知道是否可以改进。实际修改后的代码现在看起来像这样(我排除了读取、删除、清除的代码)。似乎也不再需要 scope.cfc 组件的单个实例。
<cfcomponent>
<cfscript>
variables.scope=false;
variables.scopeName=false;
</cfscript>
<cffunction name="init" access="public" output="no" returntype="scope">
<cfargument name="scope" type="struct" required="yes">
<cfargument name="scopeName" type="string" required="yes">
<cfscript>
variables.scope=arguments.scope;
variables.scopeName=arguments.scopeName;
return this;
</cfscript>
</cffunction>
<cffunction name="write" access="public" output="no" returntype="boolean">
<cfargument name="key" type="string" required="yes">
<cfargument name="value" type="any" requires="yes">
<cfargument name="timeout" type="numeric" required="no" default="10">
<cftry>
<cflock type="exclusive" name="zcore-#variables.scopeName#-scope-#arguments.key#" timeout="#arguments.timeout#" throwontimeout="yes">
<cfscript>
variables.scope[arguments.key]=arguments.value;
</cfscript>
</cflock>
<cfcatch type="lock"><cfreturn false></cfcatch>
</cftry>
<cfreturn true>
</cffunction>
</cfcomponent>
** Edit3:** 我测试了通过这样的组件方法从服务器范围读取的性能,发现它比使用只读锁直接读取服务器范围慢 20 倍,而没有使用只读锁慢 4 倍锁。每个请求数百或数千次额外函数调用的开销太慢了。在 Railo 3.3.x 上完成的测试。
我更喜欢在非公共(public)请求中构建一个大对象,然后设置一个共享内存作用域键,然后尝试将一个不完整的对象写入作用域。示例:
<cfscript>
ts=structnew();
ts.largeObject=buildLargeObject();
server.cachedObject=ts;
</cfscript>
当您只将完整的对象写入共享内存时,这可以让您避免锁定整个应用程序,因为更新单个结构键是线程安全的。但是,当您在启动时构建大对象时,您需要确保在完全创建该对象之前将其锁定。
我将通过在 init 函数中使用 this 范围而不是变量范围来使范围变量变得直接可读,以避免降低应用程序的速度。
最佳答案
CFLOCK 仅在每次出现都以相同方式锁定时才阻止代码执行。
例如:
page1.cfm
<cflock type="exclusive" scope="server" timeout="10" >
<cfset application.xyz = 'abc'>
</cflock>
page2.cfm
<cfset application.xyz = '123'>
如果 page2 与 page1 同时运行,Page2.cfm 将取消对 page1.cfm 的所有锁定。也就是说,最好在 cfc 内部进行锁定,这样就不必锁定每个对象。
但是,锁定每次出现是不够的。以下内容也没什么用。
page1.cfm
<cflock type="exclusive" scope="server" timeout="10" >
<cfset application.xyz = 'abc'>
</cflock>
page2.cfm
<cflock type="exclusive" scope="server" timeout="10" >
<cfset application.xyz = '123'>
</cflock>
这将停止对 page1 和 page2 的每个请求的处理,但不会保护 page1 上的 application.xyz 免受对 page2 上的 application.xyz 所做的更改。为此,您需要 give your locks a "name" .
Locks name. Mutually exclusive with the scope attribute. Only one request can execute the code within a cflocktag with a given name at a time. Cannot be an empty string.
Permits synchronizing access to resources from different parts of an application. Lock names are global to a ColdFusion server. They are shared among applications and user sessions, but not clustered servers.
因为您正在创建对象的多个实例,所以我相信 serverMemoryManagerObject
可能会干扰 serverMemoryManagerObject2
,除非您为锁命名。
这里有一些关于锁定注意事项的更多信息
关于multithreading - 使用依赖注入(inject)时如何使共享资源线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13190209/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!