我有一些关于Java多线程问题的问题.请尽可能多地为我提供帮助.
0)假设我们有2个银行账户,我们需要以线程安全的方式在它们之间转账.即
accountA.money += transferSum;
accountB.money -= transferSum;
Run Code Online (Sandbox Code Playgroud)
存在两个要求:
你能就此提出一些想法吗?
1)假设2个线程通过synchronized方法或使用显式锁来修改某个类字段.无论同步如何,都不能保证线程可以看到该字段,通过NOT synchronized方法读取它.- 这是对的吗?
2)通过notify方法唤醒的线程可以等待锁定多长时间?假设我们有这样的代码:
synchronized(lock) {
lock.notifyall();
//do some very-very long activity
lock.wait() //or the end of synchronized block
}
Run Code Online (Sandbox Code Playgroud)
我们可以说至少有一个线程会成功并抓住锁吗?由于某些超时,信号会丢失吗?
3)来自Java Concurrency Book的引文:
"单线程执行程序还提供了足够的内部同步,以保证任务所做的任何内存写入对后续任务都是可见的;这意味着对象可以安全地限制在"任务线程"中,即使该线程可能会被另一个时间替换掉时间."
这是否意味着,在单线程执行程序,执行剩下的代码的唯一线程安全的问题是数据的比赛,我们可以放弃volatile变量,而忽略所有的知名度的问题?它看起来像是解决大部分并发问题的通用方法.
4)所有标准的getter和setter都是原子的.如果字段标记为volatile,则无需同步它们.- 这是对的吗?
5)静态字段和静态块的启动由一个线程完成,因此不需要同步.- 这是对的吗?
6)为什么一个线程如果通过wait()方法离开锁定就需要通知其他人,但是如果它通过退出synchronized块而离开锁定则不需要这样做?
这让我发疯,我正在尝试构建log4cxx库,以便在我一直在使用的c ++项目中使用.我正在运行VS2010 express c ++版的win7主机上.我遵循log4cxx指令()的指示,包括下载apr和apr-util以及动机.hw文件,但不幸的是,当我尝试加载log4cxx.dsw解决方案并将其转换为当前的VS时,我尝试生成apr.apr/dsw和一堆其他依赖的.dsw文件时收到错误.有什么建议?
具体来说,我所看到的是:
The Project file 'C:\...projects\apr-util\xml\expat\lib\xml.dsp' cannot be loaded. Do you want to remove the unloadable project from the solution?
Run Code Online (Sandbox Code Playgroud)
我看到了一堆其他的.dsp文件.
然后在VC的输出框中:
C:\Users\x\Documents\Visual Studio 2010\Projects\apr\apr.dsp : error : Project upgrade failed.
C:\Users\x\Documents\Visual Studio 2010\Projects\apr-util\xml\expat\lib\xml.dsp : error : Project upgrade failed.
C:\Users\x\Documents\Visual Studio 2010\Projects\apr-util\aprutil.dsp : error : Project upgrade failed.
C:\Users\x\Documents\Visual Studio 2010\Projects\apache-log4cxx-0.10.0\projects\log4cxx.dsp : error : Project upgrade failed.
Run Code Online (Sandbox Code Playgroud)
谢谢
文件位于正确的路径中.
在Javascript中我有简单的测试代码:
function x(a, b) {
alert(a);
alert(b);
}
var c = [1,2];
x(c);
Run Code Online (Sandbox Code Playgroud)
其发送的参数c的功能x()作为一个参数,分配给a和b撑未定义: - /
如何将数组作为多个参数发送到函数,而不是作为一个数组?
我希望在页面上元素发生变化时播放声音.我知道如何做到这一点,但我不能让它发挥仅在第一个变化,而不要以后做,直到用户聚焦窗口(标签),并再次模糊了.
我目前的代码:
var notif = new Audio('http://cycle1500.com/sounds/infbego.wav');
if (window.innerHeight === window.outerHeight) {
$(window).bind('DOMNodeInserted', function() {
notif.play();
});
}
Run Code Online (Sandbox Code Playgroud) 我有一个脚本,在页面加载时启动,我一直在使用下面的代码来启动它:
if (window.addEventListener) {
window.addEventListener('load', otherRelatedParts, false);
}
else if (window.attachEvent) {
window.attachEvent('onload', otherRelatedParts );
}
Run Code Online (Sandbox Code Playgroud)
但今天我尝试使用这样的自调用函数:
(function() {
otherRelatedParts();
}())
Run Code Online (Sandbox Code Playgroud)
它似乎适用于所有浏览器并且代码较少.这是向窗口加载添加事件的首选方法吗?
我有下表:
<table id="test">
<tr>
<td>test</td>
<td>test</td>
<td>test</td>
</tr>
<tr>
<td>test</td>
<td>test</td>
<td>test</td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
我需要td使用CSS 隐藏第三个元素.
结果我需要类似下面的HTML:
<table id="test">
<tr>
<td>test</td>
<td>test</td>
</tr>
<tr>
<td>test</td>
<td>test</td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
我怎样才能隐藏td每一行中的第三个?
在tag元素中不添加类或id - 需要仅使用CSS隐藏.
我想知道是否有一种简单的方法来延迟点击事件在指定的时间段内被处理.例如,我们可以
$('#someElement').on('click', 'a', function(event) {
var duration = 1000;
someAsynchronousFunction(); // Start as soon as click occurs
... // Code to delay page transition from taking place for duration specified
});
Run Code Online (Sandbox Code Playgroud)
因此,在这种情况下,异步函数将保证运行一段时间.如果它还没有完成它的工作,我就不在乎了,只想继续页面转换.我知道有可能完成一些事情
event.preventDefault();
...
setTimeout(function(){
window.location = $(this).attr('href');
}, duration);
Run Code Online (Sandbox Code Playgroud)
但这仅在被点击的链接转到整页时才有效.我希望能够处理用于ajax调用的链接(不会更改URL).
我注意到mixpanel库有一个函数track_links,它似乎可以实现页面转换的延迟,尽管这个函数似乎不能很好地支持我提到的ajax链接.
任何帮助都会很棒!谢谢.
编辑:所以我想我的问题并不完全清楚,所以我将尝试在下面提供更多细节.
我不在乎异步函数是否完成运行!我只想保证它有一定的时间来执行,之后我不在乎它是否完成,并且更愿意继续进行页面转换.
即我想延迟不是异步函数的开始,而是延迟页面转换的开始.单击发生后,异步功能将立即开始运行.
希望这更清楚一点!
我想使用html预取来预取字体文件.我按照这里的建议:https://css-tricks.com/prefetching-preloading-prebrowsing/
<!doctype html>
<html>
<head>
<link rel="prefetch" href="https://fonts.gstatic.com/s/opensans/v13/cJZKeOuBrn4kERxqtaUH3ZBw1xU1rKptJj_0jans920.woff2">
<style>
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 400;
src: local('Open Sans'), local('OpenSans'), url(https://fonts.gstatic.com/s/opensans/v13/cJZKeOuBrn4kERxqtaUH3ZBw1xU1rKptJj_0jans920.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
}
html, body {
font-family: 'Open Sans';
}
</style>
</head>
<body>
Hello world
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
但是,字体文件实际上在Chrome上加载了两次.我没有尝试过其他浏览器.
我做错了什么吗?
我正在使用Adobe Brackets 1.0代码编辑器.
我有.php包含HTML&PHPlines的页面.
HTML线条缩进精细但 PHP线条不能正确缩进!
是否有任何扩展或方法强制PHP行正确缩进?
我已经使用并尝试了以下扩展,但他们没有完成这项工作:
谢谢
PS我无法相信这样优秀的编辑器缺乏开箱即用的这一重要特性和功能.
在Nicolò回答之后更新:


javascript ×4
html ×3
jquery ×2
android ×1
c++ ×1
code-editor ×1
concurrency ×1
countdown ×1
css ×1
html5 ×1
html5-audio ×1
java ×1
log4cxx ×1
overriding ×1
php ×1
prefetch ×1
visual-c++ ×1