在C#应用程序中,假设我有一个包含一些配置项的全局类,如下所示:
public class Options
{
int myConfigInt;
string myConfigString;
..etc.
}
static Options GlobalOptions;
Run Code Online (Sandbox Code Playgroud)
这个类的成员将用于不同的线程:
Thread1: GlobalOptions.myConfigString = blah;
Run Code Online (Sandbox Code Playgroud)
而
Thread2: string thingie = GlobalOptions.myConfigString;
Run Code Online (Sandbox Code Playgroud)
当2个线程访问不同的成员时,使用锁来访问GlobalOptions对象也会不必要阻塞,但另一方面,为每个成员创建一个sync-object似乎也有点过头了.
此外,使用全局选项上的锁定会使我的代码不那么好看; 如果我要写
string stringiwanttouse;
lock(GlobalOptions)
{
stringiwanttouse = GlobalOptions.myConfigString;
}
Run Code Online (Sandbox Code Playgroud)
到处都是(这是线程安全的还是stringiwanttouse现在只是一个指向myConfigString的指针?是的,我是C#的新手......)而不是
string stringiwanttouse = GlobalOptions.myConfigString;
Run Code Online (Sandbox Code Playgroud)
它使代码看起来很糟糕.
那么......确保线程安全的最佳(也是最简单!)方法是什么?
在ASP.NET中,我的app_code文件夹中有大量的.cs文件.如果我可以通过他们属于我的项目中的模块来组织它们会很棒,所以当我展开app_code文件夹时,我不会永远滚动它.你是如何组织自己的?
我将第一次使用BDD(行为驱动设计),并试图习惯这种处理问题的不同方式.
您能否提供一些故事/场景,您可以使用BDD说一个简单的登录应用程序?
例如,根据我的阅读,似乎很好:
当用户输入无效的用户ID /密码时,则显示错误消息.
相反:
通过在数据库中搜索匹配的记录来验证ID和密码.
似乎在我努力维持OO原则时,这一切看起来都是如此做作或不自然.
我如何要求TFS仅在给定日期之后向我显示工作区(或文件夹)中的已修改文件(新文件和已编辑文件).
可能吗?或者我是否必须完成所有历史并构建自己的"修改树".
有没有人知道Eclipse或TextMate的Mako模板的语法高亮?
我知道.makoUbuntu中的默认文本编辑器有一个语法高亮显示器.
我有一个方法,我希望能够接受单个字符串(路径,但不一定是运行代码的机器上存在的路径)或字符串列表/元组.
鉴于字符串充当字符列表,我如何判断该方法收到了哪种类型?
我希望能够接受单个条目的标准字符串或unicode字符串,以及多个列表或元组,所以isinstance似乎不是答案,除非我错过了一个聪明的技巧(比如服用)共同祖先类的优势?).
Python版本是2.5
我们有一些应用程序有时会陷入糟糕的状态,但仅限于生产(当然!).虽然进行堆转储可以帮助收集状态信息,但使用远程调试器通常更容易.设置它很容易 - 只需将其添加到他的命令行:
-Xdebug -Xrunjdwp:transport = dt_socket,server = y,suspend = n,address = PORT
似乎没有可用的安全机制,因此在生产中启用调试将有效地允许任意代码执行(通过hotswap).
我们在Solaris 9和Linux(Redhat Enterprise 4)上运行了1.4.2和1.5个Sun JVM.我们如何启用安全调试?有没有其他方法来实现我们的生产服务器检查目标?
更新:对于JDK 1.5+ JVM,可以指定调试器应绑定的接口和端口.因此,如果在服务器上正确设置了SSH,KarlP建议绑定到环回并仅使用SSH隧道连接到本地开发人员框.
但是,似乎JDK1.4x不允许为调试端口指定接口.那么,我们可以阻止访问网络中某个地方的调试端口,或者在操作系统本身中进行一些特定于系统的阻塞(如Jared建议的那样,IPChains等)?
更新#2:这是一个让我们限制风险的黑客,即使在1.4.2 JVM上也是如此:
命令行参数:
-Xdebug
-Xrunjdwp:
transport=dt_socket,
server=y,
suspend=n,
address=9001,
onthrow=com.whatever.TurnOnDebuggerException,
launch=nothing
Run Code Online (Sandbox Code Playgroud)
用于打开调试器的Java代码:
try {
throw new TurnOnDebuggerException();
} catch (TurnOnDebugger td) {
//Nothing
}
Run Code Online (Sandbox Code Playgroud)
TurnOnDebuggerException可以是任何保证不被抛出的异常.
我在Windows机器上对此进行了测试,以证明(1)调试器端口最初没有接收到连接,并且(2)抛出如上所示的TurnOnDebugger异常导致调试器变为活跃状态.启动参数是必需的(至少在JDK1.4.2上),但是JVM正好处理了垃圾值.
我们计划制作一个小型servlet,在适当的安全性之后,可以允许我们打开调试器.当然,之后无法将其关闭,调试器一旦打开就仍然会混杂地监听.但是,这些是我们愿意接受的限制,因为生产系统的调试将始终导致重新启动.
更新#3:我最后写了三个类:(1)TurnOnDebuggerException,一个简单的'ol Java异常,(2)DebuggerPoller,一个后台线程检查文件系统上是否存在指定文件,以及(3)DebuggerMainWrapper,一个类启动轮询线程,然后反射调用另一个指定类的main方法.
这是它的用法:
现在,当您启动JVM时,除了启动后台轮询器线程之外,所有内容都是相同的.假设文件(我们的名为TurnOnDebugger)最初不存在,轮询器每隔N秒检查一次.当轮询器首次注意到它时,它会抛出并立即捕获TurnOnDebuggerException.然后,代理人开始了.
您无法将其关闭,并且机器在打开时不是非常安全.从好的方面来说,我不认为调试器允许多个同时连接,因此保持调试连接是最好的防御.我们选择了文件通知方法,因为它允许我们通过在只有正确使用权限的目录中指定触发器文件来捎带我们现有的Unix authen/author.您可以轻松地构建一个通过套接字连接实现相同目的的war文件.当然,由于我们无法关闭调试器,因此我们只会在杀死病毒应用程序之前使用它来收集数据.如果有人想要这个代码,请告诉我.但是,您只需要几分钟就可以将它们放在一起.
我想在编写一个在内核模式下运行的"进程分析器"时寻求一些指导.我要求内核模式分析器是因为我运行大量的应用程序,我不希望我的分析器被换出.
当我说"进程分析器"时,我的意思是监视进程的资源使用情况.包括线程的使用及其统计信息.
我想在python中写这个.指向一些模块或有用的资源.
请为我提供指导/建议.
编辑:::想补充一点,目前我的兴趣是只为linux编写.然而,在我建立它后,我将不得不支持窗户.