首页 / JAVA / 用Java编写互斥锁
用Java编写互斥锁
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了用Java编写互斥锁,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2038字,纯文字阅读大概需要3分钟。
内容图文
![用Java编写互斥锁](/upload/InfoBanner/zyjiaocheng/661/dade3d48d8e24e71993fe6155aba49e5.jpg)
我是计算机科学的新手,正在读一本介绍线程和互斥量的书.我曾尝试用Java编写互斥锁,这似乎在大多数情况下都有效,但是每隔一段时间它都不会起作用.
在我的代码中,关键部分将数字1到10加到静态变量j,结果为55(如果j从0开始).如果我在关键部分同时运行三个线程,则会得到j的随机最终值,这很有意义.
但是使用下面的互斥量,大多数时候我得到的最终j值为165(55 * 3),这是我想要的,但是有时我会得到j的随机值.有人可以看看我的代码,看看发生了什么吗?谢谢!
public class Mythread extends Thread {
private static int j = 0;
private static int mutex = 0; // Initial value of the mutex is 0;
@Override
public void run() {
while (test_and_set(mutex) == 1) {
// wait here if mutex is 1
System.out.println("Thread waiting..");
}
for (int i = 1; i <= 10; i++) { // Start of Critical section
j += i; //
}
System.out.println(j); // End of Critical section
// Should add on 55 to j if one thread is running through the CS
mutex = 0; // Thread that has finished the CS sets the mutex to 0.
}
public static int test_and_set(int oldMutexValue) {
if (mutex == 0) {
mutex = 1;
}
return oldMutexValue;
}
}
public class Test1 {
public static void main(String[] args) {
Mythread thread1 = new Mythread();
Mythread thread2 = new Mythread();
Mythread thread3 = new Mythread();
thread1.start();
thread2.start();
thread3.start();
}
}
解决方法:
您正在创建竞争条件并使用旋转锁.不建议在Java中使用旋转锁.考虑以下:
一个线程开始执行,而其他两个则等待.其他两个线程在等待.现在,其他两个线程都同时设置了互斥锁,并且都开始执行,为您提供了一个奇数的J值,因为它们同时更改了它.
修理:
实现Java同步方法.同步是Java处理线程安全和控制的内部方法.没有旋转锁!
将您的MyThread更改为以下内容:
public class MyThread extends Thread {
private static int j = 0;
public void run() {
synchronized(this) {
for (int i = 1; i <= 10; i++) {
j += i;
}
}
System.out.println(j);
}
同步可以包围可能导致竞争状况,数据同时更改等的代码的任何关键部分.请注意,缺少特定的锁.请注意,当您同步对该对象的控制时,synced会将其自己的对象作为参数,但是,如果需要,您也可以轻松地将其他对象作为参数,从而为锁定对象时提供了更大的灵活性.
您的其余代码将完全相同!
希望这可以帮助!
内容总结
以上是互联网集市为您收集整理的用Java编写互斥锁全部内容,希望文章能够帮你解决用Java编写互斥锁所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。