如果线程不请求锁本身,则线程可以更改java锁对象数据吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如果线程不请求锁本身,则线程可以更改java锁对象数据吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2062字,纯文字阅读大概需要3分钟。
内容图文
![如果线程不请求锁本身,则线程可以更改java锁对象数据吗?](/upload/InfoBanner/zyjiaocheng/664/21f3ede964b441e2aa6af075e09a3a14.jpg)
Oracle的教程Intrinsic Locks and Synchronization说:
Intrinsic[Monitor] locks play a role in both aspects of synchronization: enforcing exclusive access to an object’s state
我假设如果一个线程正在执行“同步”方法,则一个对象中的任何值都不能同时被两个线程操纵.
因此,当以下代码具有以下输出时,我感到很惊讶(尽管出于我想要做的目的而松了一口气).我不太确定会发生什么,但是我发现有错误或可能会发生某些情况.
据我了解,如果另一个线程正在请求该对象的监视状态,则“同步”仅用于限制对该对象的访问,但如果另一个线程正在更改一个值,则不会.这个对吗?
public class HelloWorld implements Runnable{
Thread t1;
Thread t2;
int val1 = 0;
int val2 = 0;
public static void main(String[] args) {
HelloWorld h1 = new HelloWorld();
h1.t1 = new Thread(h1);
h1.t2 = new Thread(h1);
h1.t1.start();
h1.t2.start();
}
@Override
public void run() {
System.out.println("STARTED");
System.gc();
Thread currentThread = Thread.currentThread();
if (currentThread == this.t1) {
this.locker(); //This is a synchronized method, incrementing val1
}
if (currentThread == this.t2) {
this.adder(); //This is a non-synchronized method, incrementing val2
}
}
private synchronized void locker() {
for(int i = 0; i < 3; i++){
val1++;
System.out.println("LOCKER: " + this.val1);
}
}
private void adder() {
while(this.val2 < 3) {
this.val2++;
System.out.println("ADDER: " + this.val2);
}
synchronized(this) {
//Synchronize for final output
System.out.println("FINAL");
System.out.println(val1);
System.out.println(val2);
}
}
}
STARTED
STARTED
ADDER: 1
LOCKER: 1
LOCKER: 2
ADDER: 2
LOCKER: 3
ADDER: 3
FINAL
3
3
解决方法:
措辞“强制对对象状态的独占访问”可能会引起误解.同步代码可用于实现对对象状态的互斥访问,但是(a)并不强制这样做,并且(b)受保护状态不一定是被锁定对象的状态.在该教程后面的示例中对此进行了演示,其中两个对象lock1和lock2用于保护字段c1和c2,这些字段不是其自身状态的一部分.
同步强制执行的是对代码的独占访问权-同一监视器上同步块内的任何代码只能由拥有该监视器的线程来运行.这可用于确保对该状态的独占访问-但前提是您正确编写了代码(即,将对状态的所有访问都放在了同步块中).
没有什么可以阻止您编写从不受保护的代码访问字段的程序,在这种情况下,将不强制执行独占访问.
内容总结
以上是互联网集市为您收集整理的如果线程不请求锁本身,则线程可以更改java锁对象数据吗?全部内容,希望文章能够帮你解决如果线程不请求锁本身,则线程可以更改java锁对象数据吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。