文档章节

Java学习日志(11-2-同步/锁)

Almon
 Almon
发布于 2016/08/13 17:38
字数 630
阅读 2
收藏 0

同步代码块

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();
	}
}

 

© 著作权归作者所有

共有 人打赏支持
Almon
粉丝 2
博文 64
码字总数 44346
作品 0
江北
私信 提问
Java多线程学习(二)synchronized关键字(2)

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀
2018/04/16
0
0
Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释

原文:https://blog.csdn.net/xionghan01/article/details/52840358 一、线程5种状态 新建状态(New) 新创建了一个线程对象。 就绪状态(Runnable) 线程对象创建后,其他线程调用了该对象的...

Tenderrain
2018/06/22
0
0
Java SE1.6中的Synchronized

1 引言 在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了J...

serenity
2015/07/15
0
0
CAS原理 Java SE1.6中的Synchronized

在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁(后面的章节还会谈到锁)。 锁机制存在以下问题: (1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延...

指尖的舞者
2014/04/23
0
0
java中高级大公司多线程面试题

1)在Java中Lock接口比synchronized块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它? lock接口在多线程和并发编...

java成功之路
2018/10/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Windows 上安装 Scala

在安装 Scala 之前需要先安装 Java 环境,具体安装的详细方法就不在这里描述了。 您可以自行搜索我们网站中的内容获得其他网站的帮助来获得如何安装 Java 环境的方法。 接下来,我们可以从 ...

honeymose
31分钟前
0
0
数据库篇多表操作

第1章 多表操作 实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系...

stars永恒
今天
3
0
nginx日志自动切割

1.日志配置(Nginx 日志) access.log----记录哪些用户,哪些页面以及用户浏览器,IP等访问信息;error.log------记录服务器错误的日志 #配置日志存储路径:location / {      a...

em_aaron
昨天
5
0
java 反射

基本概念 RTTI,即Run-Time Type Identification,运行时类型识别。RTTI能在运行时就能够自动识别每个编译时已知的类型。   要想理解反射的原理,首先要了解什么是类型信息。Java让我们在运...

细节探索者
昨天
2
0
推荐转载连接

https://www.cnblogs.com/ysocean/p/7409779.html#_label0

小橙子的曼曼
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部