Synchronized的使用

synchronized 关键字的使用

三种使用方法

1.定义在普通方法上 ,锁的是操作这个方法的对象 ,即this;

2.定义在同步代码块,同步代码块锁的是()内的对象;

3.定义在静态方法上,锁的是类的模板对象:class对象,同一个类的对象都是获得同一把锁。


package com.jacob.thread.sxtsynchronized;

public class TestSyn {
public static void main(String []args) {
	Money m = new Money(100);
	new BankATM(m).start();
	new BankATM(m).start();
}
}

//多线程的使用
//同步问题是  多个线程同时操作同一个对象的情况  出现数据的不安全

//首先定义一个公共的资源
class Money{
	int num;
	Money(int num){
		this.num=num;
	}
}


//再定义一个支持多线程的类来操作公共的资源
class BankATM extends Thread{
	static Money money;
	BankATM(Money money)
	{
		this.money=money;
	}
	//定义线程体  操作公共对象
	public void run() {
		func();
	}
	//静态方法 锁的是类的模板  就是class 对象的锁
	//同一个类的对象的模板是一样的  所以能锁住
	static synchronized void staticfunc() {
		while(money.num>0)
		{money.num--;
		System.out.println(Thread.currentThread().getName()+"现在还剩:"+money.num);
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	//同步方法  锁的是调用的当前对象  
	//在这个例子中是锁不住的
	public synchronized void func() {
		while(money.num>0)
		{money.num--;
		System.out.println(Thread.currentThread().getName()+"现在还剩:"+money.num);
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	public void kuai() {
		//同步块锁的是括号内的对象 粒度更小性能更高
		synchronized(money){
			while(money.num>0)
			{money.num--;
			System.out.println(Thread.currentThread().getName()+"现在还剩:"+money.num);
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值