我最近看到了一些Clojure或Scala(对不起,我不熟悉它们),他们确实在列表或类似的东西上拉链.什么是拉链,它来自哪里?
只是好奇知道哪些CPU架构支持比较和交换原子基元?
我相信我在某些时候读过,由于在Dalvik VM上运行Android,JVM(Clojure,Jython,JRuby等)的动态语言很难在Dalvik上获得良好的性能(因此在Android上).如果我没记错的话,理由是在引擎盖下,为了实现动态类型,对java字节码进行了相当多的调整,并且字节码 - > dalvik转换不会轻易地解决这个问题.
如果我想为Android开发,我应该避免使用动态JVM语言吗?
编辑:我想我应该提供更多的上下文.我正在考虑使用Clojure为Android开发应用程序.我考虑使用Clojure有几个原因:
我想学习FP
我真的不在乎学习Java
Clojure似乎有一些非常有趣的语言概念(例如STM).
但是,当我尝试在Clojure中为Android编写应用程序时,我发现存在一个令人无法接受的性能问题.但是我发现一篇博文说,动态类型语言(例如Clojure)会因为获得动态类型所需的字节码操作而出现问题.所以我有点寻找独立的确认,这是真的,或者不是.我应该知道的最好是假设在这个特定的问题中,所有动态类型的JVM语言都可以被视为相同.我想我确实提出了一个相当广泛的问题所以我想我不应该对人们不太了解我的要求感到惊讶.
如果我创建仅在单个线程中使用的类,我是否应该使它们成为线程安全的,即使我现在不需要它?可能会发生这种情况,我后来在多个线程中使用这个类,那时我可能会遇到竞争条件,如果我没有首先使用类线程安全的话,可能很难找到它们.或者我应该让这个类不是线程安全的,以获得更好的性能?但过早的优化是邪恶的.
不同的问题:如果需要,我应该让我的类线程安全(如果在多个线程中使用,否则不是)或者我应该优化这个问题然后需要(如果我看到同步占用处理时间的一个重要部分)?
如果我选择其中一种方法,是否有减少缺点的方法?或存在第三种可能性,我应该使用?
编辑:我说出这个问题出现在我脑海中的原因.在我们公司,我们编写了一个非常简单的用户管理,将数据写入属性文件.我在一个网络应用程序中使用它,经过一些工作后我得到了奇怪的错误,用户管理忘记了用户的属性(包括名称和密码)和角色.这非常令人讨厌但不能始终如一地重现,所以我认为这是竞争条件.由于我同步了所有从磁盘上读取和写入的方法,因此问题就消失了.所以我想,如果我们首先用同步编写了类,那么我可能已经避免了所有的麻烦了?
编辑2:当我查看实用程序员的提示时,我看到了提示#41:始终为并发设计.这并不是说所有代码都应该是线程安全的,但它说设计应该考虑到并发性.
我正在研究使用ByteBuffers从内存映射文件(通过FileChannel.map())以及内存中直接ByteBuffers 构建的东西.我试图了解并发和内存模型约束.
我已经阅读了FileChannel,ByteBuffer,MappedByteBuffer等所有相关的Javadoc(和源代码).很明显,特定的ByteBuffer(和相关的子类)有一堆字段,并且状态不受内存模型的保护观点看法.因此,如果跨线程使用该缓冲区,则必须在修改特定ByteBuffer的状态时进行同步.常见的技巧包括使用ThreadLocal包装ByteBuffer,复制(同步)以获取指向相同映射字节的新实例等.
鉴于这种情况:
B_all为整个文件提供了一个映射的字节缓冲区(比如它<2gb)B_1,该文件的一大块并将其提供给线程T1B_2指向相同映射字节的ByteBuffer 并将其提供给线程T2我的问题是:T1可以写入B_1,T2可以同时写入B_2并保证看到彼此的变化吗?T3可以使用B_all来读取这些字节并保证看到T1和T2的变化吗?
我知道,除非您使用force()指示操作系统将页面写入磁盘,否则不一定会在进程中看到映射文件中的写入.我不在乎.假设这个问题,这个JVM是编写单个映射文件的唯一进程.
注意: 我不是在寻找猜测(我可以自己做得很好).我想引用一些关于内存映射直接缓冲区保证(或不保证)的内容.或者,如果您有实际经验或负面测试用例,那么这也可以作为充分的证据.
更新:我已经完成了一些测试,让多个线程并行写入同一个文件,到目前为止,似乎这些写入可以立即从其他线程中看到.我不确定我是否可以依靠它.
如果已将整个.class文件序列化为byte [],并假设类的名称已知(与byte []一起传递),如何转换byte [] - > Class - >然后将其加载到JVM以便我以后可以通过调用Class.forName()来使用它?
注意: 我这样做是因为我将.class发送到另一台主机,并且主机的JVM不知道这个.class.
关于该pmap函数的文档让我想知道如何通过Web获取XML提要集合的效率.我不知道pmap会产生多少并发获取操作以及最大值.
我的J2EE webapp启动时,我一次填充一个集合.然后,几个线程可以同时访问它,但只能读取它.
我知道使用同步集合对于并行写入是强制性的,但是我仍然需要它来进行并行读取吗?
我有两个列表,我想将列表A中的每个元素与列表B中的元素相加,生成一个新列表.
我可以这样做:
List(1,2).zip(List(5,5)).map(t => t._1 + t._2)
Run Code Online (Sandbox Code Playgroud)
在Scala中有没有更简单或更简洁的方法呢?
在Clojure中,我可以这样做:
(map + [1 2 3] [4 5 6])
Run Code Online (Sandbox Code Playgroud) clojure ×5
java ×4
concurrency ×3
android ×1
atomic ×1
bytebuffer ×1
classloader ×1
common-lisp ×1
dynamic ×1
emacs ×1
filechannel ×1
jvm ×1
multicore ×1
performance ×1
pmap ×1
scala ×1
slime ×1
zip ×1