本文将来讨论java多线程的同步机制,我们先假设一个场景用代码来实现这个场景:
一个村里有一个广播站,大家都可以用广播站的“唯一的话筒”广播自己的消息(呵,这个例子。。。相当生硬)。
用代码模拟就是下面的样子:
1. VoiceTube就是话筒,它有一个方法play,将村民的消息一个字一个字的播出来;
2.模拟了两个线程代表两个村民,调用同一个VoiceTube对象的play方法,他们俩都有心理话告诉大家,你一言我一语;
3.然后咱们看看他们说了啥?
public class SynchronizedTest {
public static void main(String[] args) {
// 话筒
final VoiceTube vt = new VoiceTube();
// 线程1--村民1
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
vt.play("人生而带着偏见,");
}
}
}).start();
// 线程2--村民2
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
vt.play("还有那些后见之明的偏见。");
}
}
}).start();
}
}
// 话筒
class VoiceTube {
// 传给广播 播放
public void play(String info) {
int len = info.length();
for (int i = 0; i < len; i++) {
System.out.print(info.charAt(i));
}
System.out.println();
}
}
结果。。。:
结果就是说串了。。。人家还没说完呢,你就插嘴。。。
这咋办?话筒在那放着呢,都站在话筒旁边,你不能让人家不说话呀,得想个办法,于是村长说了整个抢答器吧,谁先抢成功了谁就把话说完,然后其他人再抢。(例子很生硬,但是是个解决办法呀)
好了,不扯了,我就是想说说java里的synchronized,这就是同步锁(村长的抢答器),所谓“同步”就是多个线程共享资源时(话筒)保证每个线程使用资源时不被破坏。
如下:
1.每个线程都用同一个VoiceTube实例vt,所以vt就是多个线程共享的资源;
2.将操作共享资源的方法play加上synchronized后,就将vt这个实例作为了一把锁;
3.每个线程调用play方法前先获取锁,获取成功后就可以执行play方法,执行完后就释放锁。
public class SynchronizedTest {
public static void main(String[] args) {
// 话筒
final VoiceTube vt = new VoiceTube();
// 线程1--村民1
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
vt.play("人生而带着偏见,");
}
}
}).start();
// 线程2--村民2
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
vt.play("还有那些后见之明的偏见。");
}
}
}).start();
}
}
// 话筒
class VoiceTube {
// 传给广播 播放
public synchronized void play(String info) {
int len = info.length();
for (int i = 0; i < len; i++) {
System.out.print(info.charAt(i));
}
System.out.println();
}
}
这样就协调了,广播就不会串话了。