112----关于线程中同步代码块,同步方法,以及同步锁的概念,区分什么是同步代码块

1.同步代码块


synchronized(obj)
{
//obj表示同步监视器,是同一个同步对象
/**.....
TODO SOMETHING
*/
}

class Singleton{
	private static Singleton instance;
	public static Singleton getInstance(){
		if(instance == null){
			synchronized (Singleton.class) {
				if(instance == null) {
					instance = new Singleton();
				}
			}
		}
		return instance;
 	}
	private Singleton(){};
}


2.同步方法

synchronized 返回值类型 方法名(参数列表)
{
/**.....
TODO SOMETHING
*/
}


同步方法的同步监听器其实的是 this


public synchronized void draw(double money) {
	if (blance >= money) {
		System.out.println(Thread.currentThread().getName()
	 		+ ",取走" + money);
	try {
		Thread.sleep(100);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
	blance = blance - money;
	System.out.println(Thread.currentThread().getName()
			 + "之后余额= " + blance);
	} else {
		System.out.println(Thread.currentThread().getName() + "余额不足,余额" + blance + ",需要取走" + money);
	}
}


3.同步锁:

通过显示定义同步锁对象来实现同步,这种机制,同步锁应该使用Lock对象充当。
在实现线程安全控制中,通常使用ReentrantLock(可重入锁)。使用该对象可以显示地加锁和解锁。
具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。



public class X {
	private final ReentrantLock lock = new ReentrantLock();
	//定义需要保证线程安全的方法
	public void  m(){
		//加锁
		lock.lock();
		try{
			//... method body
		}finally{
			//在finally释放锁
			lock.unlock();
		}
	}
}


4.同步监听器方法

wait():让当前线程放弃监视器进入等待,直到其他线程调用同一个监视器并调用notify()或notifyAll()为止。
notify():唤醒在同一对象监听器中调用wait方法的第一个线程。
notifyAll():唤醒在同一对象监听器中调用wait方法的所有线程。
这三个方法只能让同步监听器调用:
在同步方法中: 谁调用
在同步代码块中: 谁调用

5.区分

wait()、notify()、notifyAll(),这三个方法属于Object 不属于 Thread,这三个方法必须由同步监视对象来调用,两种情况:
1.synchronized修饰的方法,因为该类的默认实例(this)就是同步监视器,所以可以在同步方法中调用这三个方法;
2.synchronized修饰的同步代码块,同步监视器是括号里的对象,所以必须使用该对象调用这三个方法;
可要是我们使用的是Lock对象来保证同步的,系统中不存在隐式的同步监视器对象,那么就不能使用者三个方法了,那该咋办呢?


此时,Lock代替了同步方法或同步代码块,Condition代替了同步监视器的功能;
Condition对象通过Lock对象的newCondition()方法创建;
里面方法包括:
await(): 等价于同步监听器的wait()方法;
signal(): 等价于同步监听器的notify()方法;
signalAll(): 等价于同步监听器的notifyAll()方法;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值