每当有关Java同步的问题出现时,有些人非常渴望指出synchronized(this)应该避免的.相反,他们声称,首选锁定私人参考.
一些给出的原因是:
其他人,包括我在内,认为这synchronized(this)是一个被大量使用的习惯用法(也在Java库中),是安全且易于理解的.它不应该被避免,因为你有一个错误,你不知道多线程程序中发生了什么.换句话说:如果适用,则使用它.
我有兴趣看到一些现实世界的例子(没有foobar的东西)避免锁定this是最好的,当synchronized(this)也做的工作.
因此:您是否应始终避免synchronized(this)并使用私有引用上的锁来替换它?
一些进一步的信息(更新为答案):
synchronized方法)和显式形式synchronized(this)synchronized(this)提供,那么synchronized(this)不适用,所以这不是问题如果没有,是否有一个好的计数器示例显示迭代算法,其中不存在递归对应物?
如果所有迭代算法都可以递归表达,那么在哪些情况下更难以做到这一点?
此外,编程语言在这一切中扮演什么角色?我可以想象,Scheme程序员对Java迭代(=尾递归)和堆栈使用的看法与Java专用程序员不同.
我在看Stack Overflow问题抽象函数和虚函数有什么区别?,我想知道每个抽象函数是否应该被认为是C#中的虚函数或者一般?
我对"你必须覆盖/你可以覆盖"对这个问题的回答感到有些困惑.不是C#程序员,我倾向于认为抽象函数只是一个编译时的概念,抽象函数是定义的虚函数,因为你必须提供至少一个,但可以在层次结构的下面提供多个实现.
虚函数也具有编译时维度,因为您不能覆盖非虚函数,但它们主要是运行时概念,因为它"只是"选择基于实际接收器的正确方法实现.
我正在尝试开始Android开发.
我在Linux上使用eclipse并使用Pentium IV @ 3.2Gh和1GB内存.我只是跟着"hello android"howto,只有一个令人遗憾的结果:虚拟化太慢了.
似乎启动虚拟机必须很慢,即使我使用更好的计算机也会很慢.
我的意思是说我需要差不多10分钟才能看到"hello android",如果我把它改成"你好世界",还需要10分钟......
我该如何解决?是否有可能使eclipse在当前正在运行的虚拟机中再次加载我的应用程序而无需打开新的虚拟机?
如果每个对象添加到java.util.HashSet中以确定性的方式实现的Object.Equals()和是Object.hashCode(),是迭代顺序在HashSet的保证用于每加入相同组元素是相同的,而不管的他们被添加的顺序?
奖金问题:如果插入顺序相同怎么办?
(假设Sun JDK6具有相同的HashSet初始化.)
编辑:我原来的问题不明确.它不是关于HashSet的一般契约,而是Sun在JDK6中对HashSet的实现提供了关于确定性的保证.它本质上是非确定性的吗?什么影响其迭代器使用的顺序?
正如维基百科文章所解释的那样,begin在Scheme中是一个可以使用更基本的形式重写的库形式lambda.
但是你如何改写a begin,特别是考虑以下情况?
x
===> error: undefined identifier: x
(begin (define x 28) x)
===> 28
x
===> 28
Run Code Online (Sandbox Code Playgroud) 假设你有几个应用程序共享相同的代码和大多数其他资源,但有一些不同的外观和感觉,一些标签更改等等(想想品牌).如果每个Web应用程序都要使用自己的WAR文件,那么您将在何处放置共享资源?
我已经使用类路径来共享类和属性文件.但是javascript和css文件怎么样?是创建和部署一个额外WAR文件的最佳方法,该文件将为这些共享文件提供其他应用程序所需的文件吗?
我还想到了一个构建脚本,它做了一些魔术,并从一个共同的源码喷出(略微)不同的WAR,但我不喜欢它,因为它只是在你需要构建/测试/运行单个应用程序时不必要的复杂化.
任何其他提示和技巧将不胜感激.
在讨论Java同步问题时,有人评论说下面的代码片段不相同(并且可能编译为不同的字节码):
public synchronized void someMethod() {
//stuff
}
Run Code Online (Sandbox Code Playgroud)
和
public void someMethod() {
synchronized (this) {
//stuff
}
}
Run Code Online (Sandbox Code Playgroud)
它们是等价的吗?
我的应用程序中有一个数据类.我的应用程序永远不会被用作公共API,我将是唯一一个在我的项目中开发代码的人.
我试图保存每一盎司的处理器和内存电源.
在我的数据类中使我的数据成员具有公共/受保护/默认保护是不是一个坏主意,这样我就不必使用getter了?使用getter需要更多的内存和堆栈的创建......我相信这是不必要的.我在使用getter时可以看到的唯一原因是保护/隐私,但如果我是唯一的编码器而没有其他人会使用我的API,那么不使用getter是一个坏主意吗?
如果这是愚蠢的,请告诉我.
java ×5
scheme ×2
algorithm ×1
android ×1
c# ×1
collections ×1
css ×1
deployment ×1
field ×1
hashset ×1
iteration ×1
javascript ×1
oop ×1
performance ×1
private ×1
public ×1
recursion ×1
synchronized ×1