首页 / JAVA / java – 同步块无法正常工作
java – 同步块无法正常工作
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 同步块无法正常工作,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2017字,纯文字阅读大概需要3分钟。
内容图文
这项练习直接来自Kathy Seirra和Bert Bates的SCJP
同步代码块
在本练习中,我们将尝试同步一段代码.在该代码块中,我们将获得对象的锁定,以便其他线程在代码块执行时无法修改它.我们将创建三个线程,它们都将尝试操作同一个对象.每个线程将输出一个单个字母100次,然后将该字母递增1.我们将使用的对象是StringBuffer.
我们可以在String对象上进行同步,但不能修改一次字符串
它们是创建的,所以如果不生成新的String对象,我们将无法增加字母.最终输出应该有100个As,100个B和100个C,所有这些都是不间断的.
>创建一个类并扩展Thread类.
>重写Thread的run()方法.这是同步的地方
代码块将会去.
>为了让我们的三个线程对象共享同一个对象,我们需要创建
一个构造函数,它接受参数中的StringBuffer对象.
> synchronized代码块将获得StringBuffer的锁定
来自第3步的对象.
>在块内,输出StringBuffer 100次然后递增
StringBuffer中的字母.您可以查看第6章的StringBuffer
有助于此的方法.
>最后,在main()方法中,使用.创建一个StringBuffer对象
字母A,然后创建我们班级的三个实例并启动它们中的所有三个.
我为上面的练习编写了下面的课程(而不是100我打印10个字符)
class MySyncBlockTest extends Thread {
StringBuffer sb;
MySyncBlockTest(StringBuffer sb) {
this.sb=sb;
}
public static void main (String args[]) {
StringBuffer sb = new StringBuffer("A");
MySyncBlockTest t1 = new MySyncBlockTest(sb);
MySyncBlockTest t2 = new MySyncBlockTest(sb);
MySyncBlockTest t3 = new MySyncBlockTest(sb);
t1.start();
t2.start();
t3.start();
}
public void run() {
synchronized(this) {
for (int i=0; i<10; i++) {
System.out.print(sb);
}
System.out.println("");
if (sb.charAt(0)=='A')
sb.setCharAt(0, 'B');
else
sb.setCharAt(0, 'C');
}
}
}
我期待的输出类似于以下(10 As,10 B和10 C),但没有得到它.
AAAAAAAAAA
BBBBBBBBBB
CCCCCCCCCC
相反,我得到了不同的输出,如下面的三个线程
在另一个完成之前有机会进入循环.
AAAAAAAAAAAAAAAAAA
ABB
ACCCCCCCC
我的问题是为什么run方法中的synchronized块不起作用?
解决方法:
4. The synchronized block of code will obtain a lock on the StringBuffer object from step 3.
好吧,你不是那样做的,不是吗?
synchronized(this) {
您正在调用MySyncBlockTest实例上的锁定,在该实例上调用run()方法.那…不会做任何事情.对该资源没有争议;每个Thread都有自己的MySyncBlockTest实例.
内容总结
以上是互联网集市为您收集整理的java – 同步块无法正常工作全部内容,希望文章能够帮你解决java – 同步块无法正常工作所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。