synchronized 关键字的理解

 1、 要保护这一段代码, 必须将它变为临界区,使用Java提供我们的锁机制(同步监视控制)

2、在同一个服务线程中(不管是不是同一个任务执行体),这里形象比喻Person(线程)上Toilet(临界区),一次且只能有一个人在Toilet里,只要Person不出来(不释放锁),其他人(其他线程)就不能进入。 

3、简单来说就是:两个人不能在一时刻拥有房间的使用权。

4、演示代码如下:

package com.tiger.toilet;

import java.util.concurrent.TimeUnit;
/**
 * 要保护这一段代码, 必须将它变为临界区
 * 使用Java提供我们的锁机制(同步监视控制)
 * 在同一个服务线程中(不管是不是同一个任务执行体),这里形象比喻Person(线程)上Toilet(临界区),
 * 一次且只能有一个人在Toilet里,只要Person不出来(不释放锁),其他人(其他线程)就不能进入。
 * 
 * 简单来说就是:两个人不能在一时刻拥有房间的使用权。
 * @author tiger
 * @Date 2017年7月26日
 */
public class ToiletTest{
	public static void main(String[] args) {

		Toilet tagert = new Toilet();
		Thread th1 = new Thread(tagert,"老王");
		Thread th2 = new Thread(tagert,"小王");
		th1.start();
		th2.start();

		Toilet tagert2 = new Toilet();
		Thread th3 = new Thread(tagert2,"老李");
		th3.start();

		//另外一个执行体
		Hotel hotel = new Hotel();
		Thread th4 = new Thread(hotel,"大王");
		th4.start();
	}
}
/**
 * 将上厕所这件事情变为同步  -- 临界区
 * @author tiger
 * @Date 2017年7月26日
 */
class Toilet implements Runnable{
	String lock = "lock";
	@Override
	public void run() {
		//获取当前线程名字
		String name = Thread.currentThread().getName();
		//定义两把锁,激活两把锁
		if (name.equals("老王")) {
			this.lock = "1";
		}else{
			this.lock = "2";
		}
		//同步锁,可以看为是密码锁,密码随意分配,只要不和其他的相同即可
		synchronized (lock) {
			System.out.println(name+" 持有"+lock+"卡上厕所!");
			for (int i = 0; i < 3; i++) {
				try {
					TimeUnit.SECONDS.sleep(1);
					System.out.println(name+" 在厕所呆了 "+ i+" s");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			System.out.println(name+" 从厕所出来!");
		}
	}
}

class Hotel implements Runnable{
	String lock = "2";
//	String lock = "3";
	@Override
	public void run() {
		//获取当前线程名字
		String name = Thread.currentThread().getName();
		//同步锁,可以看为是密码锁,密码随意分配,只要不和其他的相同即可
		synchronized (lock) {
			System.out.println(name+" 持有"+lock+"卡上酒店!");
			for (int i = 0; i < 6; i++) {
				try {
					TimeUnit.SECONDS.sleep(1);
					System.out.println(name+" 在酒店呆了 "+ i+" s");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			System.out.println(name+" 从酒店出来!");
		}
	}
}package com.tiger.toilet.room;

import java.util.concurrent.TimeUnit;
/**
 * 联动上锁(同步监视器),同一对象的不同临界区
 * @author tiger
 * @Date 2017年7月26日
 */
public class ToiletTest01 {
	public static void main(String[] args) {
		Task tagert = new Task();
		//一次只能有一个人在厕所里边,只有等待厕所里边的人出来,另外一个人才能进去。
		Thread th1 = new Thread(tagert,"老王");
		Thread th2 = new Thread(tagert,"小王");
		th1.start();
		th2.start();
	}
}
/**
 * 线程类
 * @author tiger
 * @Date 2017年7月26日
 */
class Task implements Runnable{
	Toilet toilet = new Toilet();
	//钥匙库
	String[] lock = {"锁1","锁2"};
	@Override
	public void run() {
		String name = Thread.currentThread().getName();
		//联动上锁
		if (name.equals("老王")) {
			toilet.room01(lock[0]);
		}else{
			toilet.room02(lock[1]);
		}
	}
}
/**
 * 厕所类
 * @author tiger
 * @Date 2017年7月26日
 */
class Toilet {
	//一号
	public void room01(String lock){
		String name = Thread.currentThread().getName();
		//同步锁,可以看为是密码锁,密码随意分配,只要不和其他的相同即可
		synchronized (lock) {
			System.out.println(name+"持有 "+lock+" 上1号厕所!");
			for (int i = 0; i < 5; i++) {
				try {
					TimeUnit.SECONDS.sleep(1);
					System.out.println(name+"在厕所呆了"+ i+"s");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			System.out.println(name+"从厕所出来!");
		}
	}
	//二号
	public void room02(String lock){
		String name = Thread.currentThread().getName();
		//同步锁,可以看为是密码锁,密码随意分配,只要不和其他的相同即可
		synchronized (lock) {
			System.out.println(name+"持有"+lock+"上2号厕所!");
			for (int i = 0; i < 5; i++) {
				try {
					TimeUnit.SECONDS.sleep(1);
					System.out.println(name+"在厕所呆了"+ i+"s");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			System.out.println(name+"从厕所出来!");
		}
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ljt-tiger

thanks

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值