文档章节

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

Almon
 Almon
发布于 2016/08/13 17:38
字数 630
阅读 2
收藏 0
点赞 0
评论 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...

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

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

Tenderrain
06/22
0
0
百词斩Java程序员面试11个问题,你会几个?2018-04-10

近日,我们在w3cschool app开发者头条上,可以看到百词斩Java程序员面经。 在分享百词斩Java面经前,w3cschool特别给程序员小伙伴们带来一些Java学习干货: 0、学习Java必备的3大神器 如果你...

W3Cschool
04/10
0
0
IBM和SAP开源其JVM诊断工具

IBM最近发布了其Java诊断工具套件,该套件包含如下工具:面向Java的产品转储分析器(Dump Analyzer)、处理垃圾收集(GC,即Garbage Collection)的Extensible Verbose Toolkit和Java锁分析器...

JavaGG
2010/03/24
0
0
Java 多线程编程 — 锁优化2

Java多线程编程-(13)- 关于锁优化的几点建议 一、背景 在《 Java多线程编程-(11)-从volatile和synchronized的底层实现原理看Java虚拟机对锁优化所做的努力》 这一篇文章中,我们大致介绍...

晨猫
04/26
0
0
关于Java里面多线程同步的一些知识

# 关于Java里面多线程同步的一些知识 对于任何Java开发者来说多线程和同步是一个非常重要的话题。比较好的掌握同步和线程安全相关的知识将使得我们则更加有优势,同时这些知识并不是非常容易...

欧阳海阳
07/13
0
0
Java SE1.6中的Synchronized

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

serenity
2015/07/15
0
0
【Practical API Design学习笔记】同步与死锁

像Java这类语言,写多线程是很经常的事情,但是在多线程中,能够保证在不同环境中都不死锁是非常不容易的。没有一种方法能够保证不死锁,但是一些设计模式和建议对此可能是有用的。 1、文档线...

亭子happy
2013/05/28
0
0
JAVA多线程和并发基础面试问答

多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题。(校对注:...

LCZ777
2014/05/26
0
0
JAVA多线程和并发基础面试问答

Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一...

清风傲剑
2014/12/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

崛起于Springboot2.X之thymeleaf(24)

1、依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency> 2、application.properties spring......

木九天
2分钟前
0
0
spring-boot:run启动时,指定spring.profiles.active

Maven启动指定Profile通过-P,如mvn spring-boot:run -Ptest,但这是Maven的Profile。 如果要指定spring-boot的spring.profiles.active,则必须使用mvn spring-boot:run -Drun.profiles=test......

夜黑人模糊灬
4分钟前
0
0
大数据分析挖掘技术学习:Python文本分类

引言 文本分类作为自然语言处理任务之一,被广泛应用于解决各种商业领域的问题。文本分类的目的是将 文本/文档 自动地归类为一种或多种预定义的类别。常见的文本分类应用如下: • 理解社交媒...

加米谷大数据
8分钟前
0
0
istio-0.8 指标监控,prometheus,grafana

配置: https://istio.io/docs/tasks/telemetry/metrics-logs/ https://istio.io/docs/tasks/telemetry/tcp-metrics/ envoy拦截请求>上报mixer>对接prometheus>grafana 效果截图: promethe......

xiaomin0322
10分钟前
0
0
公众号推荐

阿里技术 书籍:《不止代码》

courtzjl
13分钟前
0
0
关于改进工作效率

1.给不同的业务线建立需求群,所有的数据需求都在群里面提。 2.对于特别难搞定的事情,到对应的技术哪去做,有问题随时沟通。 3.定期给工作总结形成方法论。 4.学习新的技术,尝试用新的方法...

Avner
20分钟前
0
0
关于thinkphp 框架开启路径重写,无法获取Authorization Header

今天遇到在thinkphp框架中获取不到header头里边的 Authorization ,后来在.htaccess里面加多一项解决,记录下: <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews Rewrite......

殘留回憶
24分钟前
0
0
centos 使用yum安装nginx后如何添加模块 10

centos 使用yum安装nginx后如何添加模块 10 centos6.2版本,使用yum来安装了nginx,但是最近需要重新添加模块,所以就傻了,询问下有人知道怎么重新添加模块吗? PS:俺是新手,需要高手救助...

linjin200
27分钟前
0
0
dubbo 资料

dubbo资料网站: https://www.cnblogs.com/a8457013/p/7818925.html

zaolonglei
27分钟前
0
0
大型网站,你是如何架构的?

大型网站,你是如何架构的?

微小宝
29分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部