Java学习日志(11-2-同步/锁)
博客专区 > Almon 的博客 > 博客详情
Java学习日志(11-2-同步/锁)
Almon 发表于1年前
Java学习日志(11-2-同步/锁)
  • 发表于 1年前
  • 阅读 1
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

同步代码块

synchronized(对象){
    需要被同步的代码
}

    对象如同锁。持有锁的线程可以在同步中执行

    没有持有锁的线程即使获取cpu的执行权,也不能执行

同步的前提:

    1.必须要有两个或者两个以上的线程

    2.必须是多个线程使用同一个锁

    必须保证同步中只能有一个线程在运行

    优点:解决了多线程的安全问题

    弊端:多个线程需要判断锁,较为消耗资源

同步函数

Ver 1.0 同步代码块

/* 
	需求:银行有一个金库
		  有两个储户存钱每次存100,存3次
	目的:解决该程序安全问题
		  1.哪些代码是多线程运行代码
		  2.哪些是共享数据
		  3.哪些语句操作共享数据
 */

class Bank{
	private int sum;
	Object obj=new Object();
	public void add(int n){
		synchronized(obj){
			sum=sum+n;
			try{Thread.sleep(10);}catch(Exception e){}
			System.out.println("sum="+sum);	
		}
	}
}
class Cus implements Runnable{
	private Bank b=new Bank();
	public void run(){
		for(int x=0;x<3;x++){
			b.add(100);
		}
	}
}
class BankDemo{
	public static void main(String[] args){
		Cus c=new Cus();
		Thread t1=new Thread(c);
		Thread t2=new Thread(c);
		t1.start();
		t2.start();
	}
}

Ver 2.0 改用同步函数

class Bank{
	private int sum;
	Object obj=new Object();
	public synchronized void add(int n){
		sum=sum+n;
		try{Thread.sleep(10);}catch(Exception e){}
		System.out.println("sum="+sum);		
	}
}

同步函数的锁:

    函数需要被对象调用,函数都有一个所属对象的引用——this

    所以同步函数的锁是this

同步静态函数:

    同步函数被静态修饰后,使用的锁是该方法所在类的字节码文件——类名.class

synchronized(Bank.class)

多线程-单例设计模式-懒汉式

    同步函数虽然解决了同步问题,但是低效

class Single{
	private static Single s=null;
	private Single(){}
	public static synchronized Single getInstance(){	
		if(s==null){
			s=new Single();
		}
		return s;
	}
}
class SingleDemo{
	public static void main(String[] args){
		
	}
}

    利用同步代码块解决效率问题——双重判断

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

    **开发中常用饿汉式,懒汉式特点是延迟加载,用同步解决安全问题

多线程-死锁

    同步中嵌套同步 锁却不同

class dTest implements Runnable{
	private boolean flag;
	dTest(boolean flag){
		this.flag=flag;
	}
	public void run(){
		if(flag){
			synchronized(Mylock.locka){
				System.out.println("if_locka");
				synchronized(Mylock.lockb){
					System.out.println("if_lockb");
				}
			}
		}
		else{
			synchronized(Mylock.lockb){
				System.out.println("else_lockb");
				synchronized(Mylock.locka){
					System.out.println("else_locka");
				}
			}
		}
	}
}
class Mylock{
	static Object locka=new Object();
	static Object lockb=new Object();
}
class DeadLockDemo{
	public static void main(String[] args){
		Thread t1=new Thread(new dTest(true));
		Thread t2=new Thread(new dTest(false));
		t1.start();
		t2.start();
	}
}

 

共有 人打赏支持
粉丝 2
博文 64
码字总数 44346
×
Almon
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: