Java线程总结(二):线程的同步方式synchronized

本文将来讨论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();
	}
}

这样就协调了,广播就不会串话了。

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值