Locks AutoCloseable?也就是说,而不是:
Lock someLock = new ReentrantLock();
someLock.lock();
try
{
// ...
}
finally
{
someLock.unlock();
}
Run Code Online (Sandbox Code Playgroud)
我能说......么:
try (Lock someLock = new ReentrantLock())
{
someLock.lock();
// ...
}
Run Code Online (Sandbox Code Playgroud)
在Java 7中?
关于问题6721,在Linux中的同一个python应用程序中使用多处理和用户线程的最佳实践或解决方法是什么,python标准库中的锁应该在fork上清理?
为什么我需要两者?我使用子进程进行大量计算,产生的数据结构太大而无法通过队列返回 - 而是必须立即将它们存储到磁盘中.通过单独的线程监视这些子进程中的每一个似乎是有效的,因此在完成时,线程可以处理将大(例如多GB)数据读回到进程中的IO,其中需要结果以进一步计算.与其他子进程的结果相结合.子进程会间歇性地挂起,我只是(经过大量的冲击)发现是由于使用了日志记录模块而导致的.其他人在这里记录了这个问题:
https://twiki.cern.ch/twiki/bin/view/Main/PythonLoggingThreadingMultiprocessingIntermixedStudy
这指出了这个明显未解决的python问题:python标准库中的锁应该在fork上进行清理; http://bugs.python.org/issue6721
对我追踪到的困难感到震惊,我回答说:
是否有任何理由不在Python中混合使用Multiprocessing和Threading模块
有一个相当无益的建议'小心'并链接到上述.
但是冗长的讨论:问题6721表明在同一个应用程序中使用多处理(或os.fork)和用户线程是一个"错误".由于我对这个问题的理解有限,我在讨论中发现了太多的分歧,无法总结在同一个应用程序中使用多处理和线程的解决方法或策略.我的直接问题是通过禁用日志记录来解决的,但我在父进程和子进程中都创建了少量其他(显式)锁,并且怀疑我正在为自己的进一步间歇性死锁做好准备.
在python(2.7,3.2,3.3)应用程序中使用线程和多处理时,是否可以提供实用建议以避免在使用锁和/或日志记录模块时发生死锁?
当我试图删除一个表时,MySQL挂起了.我没有任何其他公开会议.怎么解决这个?我等了10个小时,这个过程还没有结束.
我有一个LockManager来管理几个线程的锁.有时线程是坏男孩,我必须杀死它们并要求LockManager释放所有锁.但是,由于我在java中使用ReentrantLock这是不可能的,我无法解锁另一个线程所拥有的锁.
我被迫使用Locks(不能使用信号量,这是功课的重点).是否有任何Java Lock实现允许我解锁其他线程拥有的锁?
到目前为止,我考虑的选项是:
您可能会觉得有用的额外资源:
我们希望在锁定等待时间超过60秒时发出警报.下面的警报脚本正在按预期执行.
但是我们希望获得更多信息,例如锁定的会话ID,锁定状态,登录名等.
有没有办法在@notification_message中包含这个?
USE [msdb]
GO
EXEC msdb.dbo.sp_update_alert @name=N'Total Lock Wait Time (ms) > 60000',
@message_id=0,
@severity=0,
@enabled=1,
@delay_between_responses=0,
@include_event_description_in=1,
@database_name=N'',
@notification_message=N'',
@event_description_keyword=N'',
@performance_condition=N'MSSQL$DB:Locks|Lock Wait Time (ms)|_Total|>|60000',
@wmi_namespace=N'',
@wmi_query=N'',
@job_id=N'00000000-0000-0000-0000-000000000000'
GO
EXEC msdb.dbo.sp_update_notification
@alert_name = N'Total Lock Wait Time (ms) > 60000',
@operator_name = N'me',
@notification_method = 1
GO
Run Code Online (Sandbox Code Playgroud) 我有MyISAM表的Mysql主从复制.所有更新都在主站上完成,选择在主站或从站上完成.
看来我们在进行某些更新时可能需要手动锁定几个表.虽然此写锁定在表上,但锁定表上不会发生任何选择.但奴隶呢?锁是否会传播出来?
假设我有table_A和table_B.我在主服务器上的table_A和table_B上启动锁定并开始执行更新.此时没有其他连接可以读取主机上的table_A和table_B吗?但是,如果此时另一个连接试图从一个奴隶读取表格,他们可以这样做吗?
在我目前的情况下,速度是必不可少的,我有一个只有多线程读取的地图,这很好.现在出现了一个要求,可能需要偶尔写入静态映射,而其他线程正在读取映射.我相信这是一个游戏规则改变者,因为我需要锁定我的地图以保证线程的安全.这造成了一个问题,因为我有多个线程10-12个线程将要读取地图.如果一张地图在地图上锁定(因为它的读数),我相信锁定是必要的,因为可能会将某些内容写入地图.无论如何,正如我之前所说,如果一张地图正在阅读,那么其他地图就不会像之前那样对地图进行并行读取访问.有什么办法可以绕过这个问题吗?
在CopyOnWriteArrayList.java中,在方法集(int index,E element)下面
public E set(int index, E element) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray();
Object oldValue = elements[index];
if (oldValue != element) {
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len);
newElements[index] = element;
setArray(newElements);
} else {
// Not quite a no-op; ensures volatile write semantics
setArray(elements);----? Why this call required?
}
return (E)oldValue;
} finally {
lock.unlock();
}
}
Run Code Online (Sandbox Code Playgroud)
为什么需要调用setArray()?我无法理解上面那个方法调用的注释.是因为我们没有使用synchronized块,我们必须手动刷新我们使用的所有变量吗?在上面的方法中,他们使用了重入锁.如果他们使用了synchronized语句,他们仍然需要调用setArray()方法吗?我想不是.
问题2:如果我们最终在else中,这意味着我们没有修改元素数组,那么为什么我们需要刷新变量数组的值?
"SELECT ... FOR UPDATE"锁是否在MySQL中加入了行?
如果是这样,是否可以禁用此行为?
文档中没有任何相关内容.我已经看到Oracle支持"SELECT ... FOR UPDATE OF table_name"table_name是主表或者受影响的行将被锁定的连接表之一,但我从来没有在MySQL的上下文中看到这一点.
启用了InnoDB插件的MySQL Server版本5.1.41.我有以下三张发票表:发票,invoice_components和invoice_expenses.表发票具有invoice_id主键.invoice_components和invoice_expenses都链接到表发票,其invoice_id为非唯一foreign_key(每张发票可以包含多个组件和多个费用).两个表都具有此外键的BTREE索引.
我有以下交易:
交易1
START TRANSACTION;
SELECT * FROM invoices WHERE invoice_id = 18 FOR UPDATE;
SELECT * FROM invoice_components WHERE invoice = 18 FOR UPDATE;
SELECT * FROM invoice_expenses WHERE invoice = 18 FOR UPDATE;
Run Code Online (Sandbox Code Playgroud)
对于第一个事务,一切正常,并且选择并锁定行.
交易2
START TRANSACTION;
SELECT * FROM invoices WHERE invoice_id = 19 FOR UPDATE;
SELECT * FROM invoice_components WHERE invoice = 19 FOR UPDATE;
SELECT * FROM invoice_expenses WHERE invoice = 19 FOR UPDATE;
Run Code Online (Sandbox Code Playgroud)
第二个事务返回ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting …
locks ×10
mysql ×4
java ×3
innodb ×2
transactions ×2
c++ ×1
collections ×1
java-7 ×1
join ×1
logging ×1
myisam ×1
python ×1
replication ×1
resources ×1
sql-server ×1