在Java中,表达式:
n+++n
Run Code Online (Sandbox Code Playgroud)
似乎评估为等同于:
n++ + n
Run Code Online (Sandbox Code Playgroud)
尽管这+n
是一个有效的一元运算符,其优先级高于算术运算+
符n + n
.因此编译器似乎假设运算符不能是一元运算符并解析表达式.
但是,表达式:
n++++n
Run Code Online (Sandbox Code Playgroud)
不编译,即使有一个有效的可能性,它可以解决为:
n++ + +n
Run Code Online (Sandbox Code Playgroud)
++n
并且+n
被指定为具有相同的优先级,那么为什么编译器会解决看似模糊的问题而不n+++n
支持算术,+
但是不会这样做n++++n
?
有关JMM的问题以及有关在同步块中写入但是读取未同步的易失性字段的语义.
在下面代码的初始版本中,我没有同步访问,因为它不需要早期的需求(并且滥用自我赋值this.cache = this.cache确保了volatile写入语义).某些要求已更改,需要同步以确保不发送重复更新.我的问题是同步块是否排除了要求自动分配易失性字段?
// Cache of byte[] data by row and column.
private volatile byte[][][] cache;
public byte[] getData(int row, int col)
{
return cache[row][col];
}
public void updateData(int row, int col, byte[] data)
{
synchronized(cache)
{
if (!Arrays.equals(data,cache[row][col]))
{
cache[row][col] = data;
// Volatile write.
// The below line is intentional to ensure a volatile write is
// made to the array, since access via getData is unsynchronized.
this.cache = this.cache;
// Notification code removed
// (mentioning it …
Run Code Online (Sandbox Code Playgroud) 我们使用Jitterbit来查询Salesforce中的记录,但是我们遇到了一个问题.在查询条件语句中,我正在比较Salesforce表中的两个字段.当我去测试查询时,它给出了错误"仅在Apex代码[MALFORMED QUERY]中允许绑定变量".
以下是查询示例:
SELECT Id FROM Price_Agreement_Item__c WHERE Approved_Date__c > Last_Upload_Date__c
Run Code Online (Sandbox Code Playgroud)
字段Approved_Date__c
和Last_Upload_Date__c
都包含在Salesforce表Price_Agreement_Item__c
.如何创建一个SOQL语句来调整select语句比较表中的两个字段?
任何帮助表示赞赏.
先感谢您.
是否有任何文件保证String.intern()
是线程安全的?javadoc暗示它但不直接解决它:
返回字符串对象的规范表示.最初为空的字符串池由String类私有维护.
调用实习方法时,如果池已经包含等于此字符串对象的字符串(由equals(Object)方法确定),则返回池中的字符串.否则,将此String对象添加到池中,并返回对此String对象的引用.
因此,对于任何两个字符串s和t,当且仅当s.equals(t)为真时,s.intern()== t.intern()才为真.
所有文字字符串和字符串值常量表达式都是实体.字符串文字在The Java™Language Specification的3.10.5节中定义.
值得注意的是,javadoc说保证池中的String被返回,但不是池本身是线程安全的(因此写入它似乎会打开门,以便在竞争线程中更换池条目,虽然我认为这种解释不太可能).
和的JDK源String
节目intern()
是不揭示它的线程安全的灯光一个本地方法:
public native String intern();
Run Code Online (Sandbox Code Playgroud)
我关心的是具体涉及到是否以下将全部线程安全的,只有一个保证MyObject
是创建(不只是存储在缓存中)在并发请求面对每个唯一的字符串值:
public void myMethod(String myString)
{
// Get object from cache, the cache itself is thread safe
MyObject object = myCache.get(myString);
if (object == null)
{
synchronized(myString.intern())
{
// Retry cache to avoid race condition
object = myCache.get(myString);
if (object == null)
{
object = new MyObject(myString);
// ... do some startup / config of the …
Run Code Online (Sandbox Code Playgroud) 我想知道在 Netty 中关闭连接时,是否有一种方法可以避免设置 TCP RST 标志而不是 TCP FIN 标志,因为 TCP 接收缓冲区中仍有输入数据。
用例是:
问题是:
接收缓冲区中的剩余数据会导致 Linux(或 Java..)使用 RST 标志来标记 TCP 数据包。这可以防止客户端读取数据,因为当它尝试尝试时,会发现由于套接字关闭而出现读取错误。
对于直接的Java套接字,我相信解决方案是在关闭之前调用socket.shutdownOutput()。Netty 中是否有等效的函数或解决此问题的方法?
如果我只是继续从套接字读取数据,可能不足以避免 RST,因为调用 close 时缓冲区中可能有也可能没有数据。
供参考: http: //cs.baylor.edu/~donahoo/practical/CSockets/TCPRST.pdf
更新:
问题的另一个参考和描述: http://docs.oracle.com/javase/1.5.0/docs/guide/net/articles/connection_release.html
调用 shutdownOutput() 应该有助于更有序地关闭连接(通过发送 FIN),但如果客户端仍在发送数据,则无论如何都会发送 RST 消息(请参阅 EJP 的答案。 shutdownOutput() 等效项可能可用在 Netty 4+ 中。
解决方案是从客户端读取所有数据(但您永远无法确定客户端何时完全停止发送,尤其是在恶意客户端的情况下),或者只是在发送响应后关闭连接之前等待(请参阅答案来自不名誉的)。