我正在进行我的Clojure任务(在4clojure.com上解决了大约80个问题)并继续阅读和编码并试图"得到它".
现在我对Clojure被设计为"无锁并发"感到困惑.我非常了解死锁(例如:"我编写了糟糕的Java代码,最终导致死锁",而不是"我是并发专家").我也读过这个:
我意识到Clojure程序不会陷入僵局.
但是我有点困惑:通过在引擎盖下无锁算法实现或使用可能的"死锁"算法实现了这样的壮举,但使用正确的实现保证永远不会死锁(这将以某种方式"隐藏"给Clojure程序员)?
最近讨论过关于无锁算法的黑客新闻:
http://news.ycombinator.com/item?id=4103921
在1024cores.net上引用以下"无锁算法"页面:
http://www.1024cores.net/home/lock-free-algorithms
我不明白这篇文章与Clojure下的并发工作方式之间的关系.
它让我完全糊涂了:当我在Clojure中开发并发程序时,它是否意味着"锁定和无锁算法"对我来说不是问题?
使用SecurityManager时是否存在性能损失?
我需要以下内容:
public class ExitHelper {
public ExitHelper() {
System.setSecurityManager(new ExitMonitorSecurityManager());
}
private static class ExitMonitorSecurityManager extends SecurityManager {
@Override
public void checkPermission(Permission perm) {}
@Override
public void checkPermission(Permission perm, Object context) {}
@Override
public void checkExit( final int status ) {
// this is the part I need and I don't care much about the performance issue of this method
}
}
Run Code Online (Sandbox Code Playgroud)
这会对我的计划产生巨大影响吗?
例如,该程序确实打开了很多文件.如果我启用SecurityManager并在那里放入一些日志,我可以调用这些方法.真的很多.在这两种方法的记录中丢失了正常的日志记录.因此,将SecurityManager置于适当的位置意味着可以进行大量的调用.它会比默认的SecurityManager慢吗?(默认情况下有吗?)
这是如何运作的?将检查程序的哪个部分的权限和频率?我关注两个checkPermission(...)方法.
无论Lisp方言如何,看起来每个包含Lisp函数的源代码文件本身都不是一个列表(我第一次"惊讶"这是在处理我的Emacs .el文件时).
我有几个问题,但它们都与同一个"问题"有关,而且可能只是我误解了一些问题.
有没有理由为什么各种Lisp方言的源代码文件似乎是一堆"无组织"的函数,如下所示:
(function1 ...)
(function2 ...)
(function3 ...)
Run Code Online (Sandbox Code Playgroud)
而不是函数的"Lisp列表",可能是这样的:
(
'(function1 ...)
'(function2 ...)
'(function3 ...)
)
Run Code Online (Sandbox Code Playgroud)
我有点惊讶这整个"代码是数据,数据是代码"的东西,看到源代码文件本身显然不是整齐的列表......或者是他们!?
源代码文件是否应该"操纵"?
如果我想将我的.clj(Clojure)源文件中的一个转换为某些CSS + HTML网页,那么源代码文件本身不是一个列表并不是一个"问题"吗?
我从Lisp开始,所以我不知道我的问题是否有意义,任何解释都是受欢迎的.
我正在使用auto-complete-mode我认为非常棒的.我也是一个狂热的粉丝,linum-mode但是当两者一起使用时,我有一个非常恼人的问题,特别是当我在一个新的缓冲区(或一个线路很少的缓冲区)工作时.
基本上缓冲区是'x'行很长但是当自动完成时它会向缓冲区"添加"行,所以linum-mode保持切换,例如,在一列或两列上显示行号,这取决于是否auto-complete建议完成或不.
因此,您键入一个句子,您会看到缓冲区的内容在每次按键时都会从左向右疯狂地移动.这真的很烦人.
我认为解决方案涉及配置linum格式变量,但我不知道如何.
理想情况下,如果我的linum格式是:
我的理由是,auto-complete不应该提出超过'y'的建议,因此,两者应该开始很好地一起玩.
例如,如果'y'设置为20而我的缓冲区有75行,那么linum应该使用两列:因为无论我在哪里auto-complete都不会使缓冲区"大于"99行.
相反,如果'y'仍然设置为20并且我的缓冲区有95行,那么linum应该使用三列,否则如果我接近缓冲区的末尾并且auto-complete在我的缓冲区中踢,则应该开始"左右摇晃"当我输入.
我宁愿不硬编码"3列宽" linum.
我想使用"动态但总是至少两列"会以某种方式解决大多数烦恼,但仍然像我描述的那样会很棒.
PS:我意识到我的"修复"意味着linum总是会显示在至少两列上,我很好...只要它保持右对齐并使用2,3或4列,具体取决于需要.
我很长一段时间都在使用Emacs而且我已经定制了很多.我甚至编写了简单的ELisp函数,现在我开始越来越多地使用宏.我不是一个知识渊博的Emacs用户,但我不是一个完整的初学者.
我正在使用nxhtml,mumamo,dired,ido,自定义键绑定以及我多年来添加的许多东西,我不记得所有这些; )
但是我真的从来没有理解过:什么是"字体锁定"模式,我为什么要关心?
例如,我读过nxhtml和nxml,如果我没记错的话,不要使用字体锁定.也许我不理解那部分,但无论如何:作为用户,它对我来说有什么变化?
或者以此为例介绍WhiteSpace:
请注意,当启用WhiteSpace时,WhiteSpace会保存字体锁定状态,即,如果打开或关闭font-lock.并且WhiteSpace在关闭时恢复字体锁定状态.因此,如果启用了WhiteSpace并且字体锁定已关闭,则WhiteSpace还会打开字体锁定以突出显示空白,但在关闭WhiteSpace时将关闭字体锁定.因此,如果您希望在关闭WhiteSpace后继续打开字体锁定,请在启用WhiteSpace之前打开字体锁定.
好的.我明白那个.但是,如果字体锁继续或不继续,它会发生什么变化?
基本上我不会"得到它",无论我读到多少关于这个主题.
关于Emacs下的"font-lock"以及为什么它关注我的任何示例/解释都是最受欢迎的!
正如在这个问题的几个答案中所建议的:
我实现了一个ReentrantReadWriteLock并且看到了一个很好的加速(我知道在我的一个类中有一些锁争用并且使用重入锁确实有助于加快速度).
但现在我想知道:如果在一个类中,所有访问(读取和写入)都是通过首先锁定读锁定或写锁定来完成的,是否意味着不应该在该类中使用synchronized关键字?
例如,这是http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html上的一个官方Java 1.6示例.
class RWDictionary {
private final Map<String, Data> m = new TreeMap<String, Data>();
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private final Lock r = rwl.readLock();
private final Lock w = rwl.writeLock();
public Data get(String key) {
r.lock();
try { return m.get(key); }
finally { r.unlock(); }
}
public String[] allKeys() {
r.lock();
try { return m.keySet().toArray(); }
finally { r.unlock(); }
}
public Data put(String key, Data value) {
w.lock(); …Run Code Online (Sandbox Code Playgroud) 为了更好地理解mapcat,我举了一个例子:
user> (mapcat #(list % %) [1 2 3])
(1 1 2 2 3 3)
Run Code Online (Sandbox Code Playgroud)
并尝试重现文档描述的用途,故意,地图和连接:
user> (doc mapcat)
clojure.core/mapcat
([f & colls])
Returns the result of applying concat to the result of applying map
to f and colls. Thus function f should return a collection.
Run Code Online (Sandbox Code Playgroud)
通过做这个:
user> (concat (map #(list % %) [1 2 3]))
((1 1) (2 2) (3 3))
Run Code Online (Sandbox Code Playgroud)
但是你可以看到它不起作用.但是,我可以像这样使用reduce,但不知道它是否正确:
user> (reduce #(concat %1 %2) (map #(vec (list % %)) [1 …Run Code Online (Sandbox Code Playgroud) 如何配置Tomcat(在独立模式下,没有Apache [*]),以便我可以在一台服务器上部署它,并根据所请求的域名提供两个不同的webapps?
这样做有什么问题?你能在这两个域上拥有SSL吗?如果有人在这里真的做到了,我会有兴趣回答这些问题以及尽可能多的反馈......
我发现了一个描述这种设置的博客条目,但它适用于Tomcat 5.5:
<Engine defaultHost="domain1.com" name="Catalina">
<Host name="domain1.com" appBase="/home/user1/domain1">
<Alias>www.domain1.com</Alias>
<Context path="" docBase="."/>
</Host>
<Host name="domain2.com" appBase="/home/user1/domain2">
<Alias>www.domain2.com</Alias>
<Context path="" docBase="."/>
</Host>
Run Code Online (Sandbox Code Playgroud)
http://iam-rakesh.blogspot.com/2009/10/hosting-multiple-domains-in-tomcat.html
此外,截至目前我有一个webapp,ROOT.war,里面.../tomcat/webapps /
一旦我有两个"根",一个用于domain1.com的 root webapp和一个用于domain2.com的 root webapp,它将如何工作? 将在什么地方的.war被定位需求?
编辑这个问题不是关于如何使用Ant/Maven/Gradle或诸如此类的东西来解决依赖关系.
我正在尝试使用Neo4j,我对文档有点困惑,因为我需要嵌入一个非常简单的"Hello,world!" 应用程序中的Neo4j示例.
我在几个地方看过Neo4j是轻量级的,只需要一个(现在是两个)罐子.
例如:http://highscalability.com/neo4j-graph-database-kicks-buttox
我们可以读到:"占用空间小.Neo4j是一个带有一个依赖的单个<500k jar(Java Transaction API)."
这正是我对Neo4j嵌入它感兴趣的原因之一......
所以我下载了Neo4j的社区版(GPL),并在此处阅读说明:
http://docs.neo4j.org/chunked/stable/tutorials-java-embedded-setup.html
其中说:"提取一个Neo4j下载zip/tarball,并使用lib /目录中的jar文件."
现在这不仅仅是简洁而且我发现旧消息说"措辞已经改变".有一点,Neo4j所需要的只是一个罐子(这是我有兴趣嵌入Neo4j btw的原因之一).但是现在显然已经是两个了,因为它依赖于某些Java Transaction API(其中一个是一个带有neo4j的.jar?)
问题是,如果我查看lib / dir,我有很多东西:
1115454 lib/neo4j-kernel-1.6.1.jar
153707 lib/neo4j-graph-algo-1.6.1.jar
222791 lib/neo4j-shell-1.6.1.jar
8865464 lib/scala-library-2.9.0-1.jar
43530 lib/neo4j-jmx-1.6.1.jar
590503 lib/neo4j-kernel-1.6.1-tests.jar
23954 lib/neo4j-community-1.6.1.jar
28023 lib/neo4j-udc-1.6.1.jar
1517975 lib/neo4j-cypher-1.6.1.jar
51662 lib/neo4j-graph-matching-1.6.1.jar
16030 lib/geronimo-jta_1.1_spec-1.1.1.jar
143177 lib/neo4j-lucene-index-1.6.1.jar
1466301 lib/lucene-core-3.5.0.jar
118875 lib/server-api-1.6.1.jar
92850 lib/org.apache.servicemix.bundles.jline-0.9.94_1.jar
Run Code Online (Sandbox Code Playgroud)
在system/lib中:
27461 system/lib/blueprints-neo4j-graph-1.1.jar
72650 system/lib/jettison-1.3.jar
628626 system/lib/rrd4j-2.0.7.jar
17985 system/lib/asm-analysis-3.2.jar
177174 system/lib/jetty-util-6.1.25.jar
109043 system/lib/commons-io-1.4.jar
755981 …Run Code Online (Sandbox Code Playgroud) 使用Clojure(和其他Lisp方言),您可以修改运行代码.那么,在运行时修改函数时,该更改是否可用于多个线程?
我试图找出它在并发设置中如何工作:如果有几个线程正在使用函数foo,当我重新定义(比如使用defn)函数foo时会发生什么?
必须进行一些同步:何时以及如何进行这种同步以及它的成本是多少?
在JVM上说,是使用volatile引用引用的函数吗?如果是这样,是否意味着每次都有"功能查找",那么必须支付volatile费用?