- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
ECMA-335 规范规定如下:
*获取锁(System.Threading.Monitor.Enter 或进入同步方法)应隐式执行 volatile 读取操作,并释放锁(System.Threading.Monitor.Exit 或离开同步方法)应隐式执行 volatile 写操作。(...)
volatile 读取具有获取语义,这意味着读取保证发生在 CIL 指令序列中读取指令之后发生的任何内存引用之前。 volatile 写入具有释放语义,这意味着写入保证在 CIL 指令序列中写入指令之前的任何内存引用之后发生。*
这意味着编译器不能将语句移出 Monitor.Enter/Monitor.Exit block ,但不禁止将其他语句移入 block 中。也许,甚至可以将另一个 Monitor.Enter 移到 block 中(因为可以交换 volatile 写入后跟 volatile 读取)。因此,可以使用以下代码:
class SomeClass
{
object _locker1 = new object();
object _locker2 = new object();
public void A()
{
Monitor.Enter(_locker1);
//Do something
Monitor.Exit(_locker1);
Monitor.Enter(_locker2);
//Do something
Monitor.Exit(_locker2);
}
public void B()
{
Monitor.Enter(_locker2);
//Do something
Monitor.Exit(_locker2);
Monitor.Enter(_locker1);
//Do something
Monitor.Exit(_locker1);
}
}
, 变成等同于以下内容:
class SomeClass
{
object _locker1 = new object();
object _locker2 = new object();
public void A()
{
Monitor.Enter(_locker1);
//Do something
Monitor.Enter(_locker2);
Monitor.Exit(_locker1);
//Do something
Monitor.Exit(_locker2);
}
public void B()
{
Monitor.Enter(_locker2);
//Do something
Monitor.Enter(_locker1);
Monitor.Exit(_locker2);
//Do something
Monitor.Exit(_locker1);
}
}
,可能导致死锁?还是我遗漏了什么?
câu trả lời hay nhất
ECMA-335 规范比 what the CLR (and every other implementation) uses 弱很多.
我记得读过(这里说)微软首次尝试移植到 IA-64,使用较弱的内存模型。他们有太多自己的代码取决于双重检查锁定习惯用法(在较弱的内存模型下 is broken),他们只是在该平台上实现了更强的模型。
乔达菲有 a great post为我们普通人总结(实际的)CLR 内存模型。还有一个指向 MSDN 文章的链接,该文章更详细地解释了 CLR 与 ECMA-335 的区别。
我不认为这在实践中是个问题;假设 CLR 内存模型,因为其他人都这样做。此时没有人会创建一个弱的实现,因为大多数代码都会被破坏。
关于c# - 互锁 Monitor.Enter 和 Monitor.Exit block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6902612/
Tôi tin rằng tất cả chúng (thậm chí die() hoặc die(0)) đều giống nhau. Nếu chúng không giống nhau, cái nào tốt hơn cho một kịch bản thoát thành công? Nếu chúng giống nhau, có tiêu chí ưu tiên nào cho biết tập lệnh đã hoàn tất thành công không? Tôi có xu hướng sử dụng lối ra;.
Tôi muốn biết sự khác biệt giữa các mã sau trong Java System.exit(0);System.exit(-1);System.exit(1); Khi nào tôi phải sử dụng mã trên một cách thích hợp?
Tôi nhận thấy hành vi lạ trong Powershell. Có hai tệp .ps1: main.ps1: echo "running exit.ps1" $myexitcode = & ".\exit.p
Có một số khối như "Nguồn" trong Thư viện mô hình hóa quy trình Anylogic có các hoạt động như "Khi thoát" và "Bật khi thoát". Sự khác biệt giữa hai là gì? Tôi cố gắng tạo ra
Vì vậy, tôi có tập lệnh Bash này: #!/bin/bash PID=`ps -u ...` if [ "$PID" = "" ]; then echo $(date) Server off: no
(gdb) biểu tượng thông tin thoát thoát trong phần .text của /lib64/libc.so.6 (gdb) biểu tượng thông tin _exit _exit trong se
Nếu tôi muốn khởi chạy một ứng dụng đơn giản mà tôi đã sử dụng vài tuần trước mà không gặp lỗi, tôi sẽ nhận được thông báo lỗi. Đó là mô tả lỗi của anh ấy: Khởi chạy lib\main.dart trên SM J530F ở chế độ gỡ lỗi..
Câu hỏi này đã có câu trả lời: Sử dụng Platform.exit() và System.exit(int) cùng nhau (3 câu trả lời) Đã đóng 5 năm trước. Ai đó ở đây đã đề xuất sử dụng cái sau. Tôi mới làm quen với java
Tôi hiểu rằng trong bash, một lối thoát bình thường sẽ hoàn thành một tập lệnh với trạng thái thoát của lệnh cuối cùng. Nhưng tôi cũng đã thấy mọi người sử dụng exit $? và bị nghi ngờ khi tôi đề xuất nó có hành vi tương tự. Ý nghĩa giữa hai chữ viết này là gì
Tôi đã thấy một số mã thực hiện điều này: if(something){ echo 'exit from program'; } ...more code và những mã khác chỉ sử dụng die: if
Sự khác biệt giữa thoát và thoát trong Ruby là gì? Câu trả lời hay nhất Một số điều: Trình xử lý thoát chạy dưới dạng "thoát" thay vì "thoát!" Điều này có nghĩa là bất kỳ mã nào được gán cho "Sạch" sẽ không chạy với "Thoát!"
Chúng tôi có một loạt các tập lệnh xây dựng .bat được gọi bởi trình chạy GitLab dựa trên PowerShell gần đây đã được tái cấu trúc từ: chương trình lập luận nếu !errorlevel 0 exit!
Tôi muốn đóng ứng dụng javafx bằng mã trả về được chỉ định. Duyệt qua các câu trả lời trên SO, tôi tìm thấy thành ngữ sau: Platform.exit(); Ví dụ ở đây: Stop thread be;
Sự khác biệt giữa lối ra và std::exit trong C++ là gì? Tôi đã nghiên cứu nó nhưng tôi không thể tìm thấy bất cứ điều gì. Sự khác biệt giữa hai mã này là gì: 1: if(SDL_Init(SDL_INIT_EVERYTHING)
Tôi cần một cách khác để chấm dứt tập lệnh python trong hàm luồng. Ý định của tôi là chấm dứt máy chủ khi máy khách nhập 0... Điều này không có tác dụng vì luồng chưa bị chấm dứt phải không? Đây là mã của tôi: socket = socket.socket(
Tôi muốn khởi động lại ứng dụng sau sự cố. Tôi đang sử dụng mã bên dưới để thực hiện tác vụ. Ý định mStartActivity = ý định mới(HomeActivity.this, SplashScreen
Trong Delphi, bạn có thể thoát khỏi một hàm và cung cấp cho nó một giá trị trả về, rất giống với từ khóa return trong C/C++/Java/C#, v.v. Tuy nhiên, tôi thường viết một cái gì đó như thế này: Result : = 1;
Tôi tự hỏi liệu có cách nào để xử lý các sự kiện thoát trình duyệt hay không. Ví dụ: tôi muốn gửi truy vấn khi người dùng nhấp vào dấu chéo để thoát hoặc đóng trình duyệt. Câu trả lời hay nhất Tôi nghĩ tôi đã tìm ra giải pháp. Tôi chưa thử nó trên IE nhưng có vẻ như nó hoạt động trên Firefox
Tôi tìm thấy đoạn mã sau trong tập lệnh mkinitcpio của Archlinux. cleanup() { if [[ $workdir ]] thì # khi PRESE
Tôi sử dụng đoạn mã sau để tính toán độ tương tự cosine giữa tất cả các hàng của khung dữ liệu: from pyspark.ml.feature import Normalizer from pyspark.mllib.linalg.distrib
Tôi là một lập trình viên xuất sắc, rất giỏi!