文档章节

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
江北
私信 提问
Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释

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

Tenderrain
06/22
0
0
Java多线程学习(二)synchronized关键字(2)

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

一只蜗牛呀
04/16
0
0
IBM和SAP开源其JVM诊断工具

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

JavaGG
2010/03/24
0
0
Java SE1.6中的Synchronized

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

serenity
2015/07/15
0
0
读《深入理解Java虚拟机》- 笔记08

《深入理解Java虚拟机:JVM高级特性与最佳实践》第2版 第10章 早期(编译期)优化 59. 语法糖 在计算机语言中添加某种语法,对语言的功能没有影响,但是方便开发人员使用。 泛型是一种语法糖...

阿历Ali
08/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

“敏捷开发”怎么就“敏捷”了

什么是敏捷开发 传统的软件开发过程中,我们往往会针对特定的用户需求,采用“瀑布模型”,从用户的需求开始一步步进行需求分析、软件设计、软件开发、软件测试以及软件交付与维护。 然而,这...

SamYjy
43分钟前
2
0
聊聊我怎么系统学习Linux技能并快速提高的

随着电子信息科技时代的发展,学会使用计算机在我们的生活中成为了必不可少的一项技能。而作为计算机中的三大操作系统之一的Linux更是饱受计算机爱好者们的喜爱。今天我们就来和大家一起聊一...

linuxprobe16
55分钟前
3
0
MySQL专题—— 从认识索引到理解索引【索引优化】

认识索引 认识索引是什么东西非常关键,一个非常恰当的比喻就是书的目录页与书的正文内容之间的关系,为了方便查找书中的内容,通过对内容建立索引形成目录。因此,首先你要明白的一点就是,...

架构师springboot
58分钟前
2
0
Java-怎样构造方法和匿名对象

前言 在编写程序时不安全的初始化会导致程序发生发生重大错误。为了使程序可以被安全地初始化,C++引入了构造器(也可以成为构造方法)的概念,这是一个在创建对象时被自动调用的特殊方法。J...

小刀爱编程
今天
2
0
7、MyBaties 增删改

事务 : 从数据库角度出发,完成业务时需要执行的 SQL 集合,统称一个事务. 1、在 mybatis 中默认是关闭了 JDBC 的自动提交功能 每一个 SqlSession 默认都是不自动提交事务. session.commit()提...

KingFightingAn
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部