这项练习直接来自Kathy Seirra和Bert Bates的SCJP
同步代码块
在本练习中,我们将尝试同步一段代码.在该代码块中,我们将获得对象的锁定,以便其他线程在代码块执行时无法修改它.我们将创建三个线程,它们都将尝试操作同一个对象.每个线程将输出一个单个字母100次,然后将该字母递增1.我们将使用的对象是StringBuffer.
我们可以在String对象上进行同步,但是一旦创建了字符串就无法修改它们,因此我们无法在不生成新String对象的情况下增加字母.最终输出应该有100个As,100个B和100个C,所有这些都是不间断的.
我为上面的练习编写了下面的课程(而不是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');
} …Run Code Online (Sandbox Code Playgroud)