文档章节

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...

一只蜗牛呀
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

没有更多内容

加载失败,请刷新页面

加载更多

Bash重定向详解

Bash重定向详解 Bash的重定向指的是将命令的输入和输出导向不同地方,而不是默认的标准输入、标准输出和标准错误。Bash的重定向实际上是对标准输入、标准输出和标准错误的重置,进而将所需输...

小陶小陶
今天
3
0
EventBus原理深度解析

一、问题描述 在工作中,经常会遇见使用异步的方式来发送事件,或者触发另外一个动作:经常用到的框架是MQ(分布式方式通知)。如果是同一个jvm里面通知的话,就可以使用EventBus。由于Event...

yangjianzhou
今天
12
0
OpenCV图像处理实例:libuv+cvui显示摄像头视频

#include <iostream>#include <opencv2/opencv.hpp>#define CVUI_IMPLEMENTATION#include <cvui.h>extern "C"{#include <uv.h>}using namespace std;#define WINDOW_NAM......

IOTService
今天
3
0
openJDK之JDK9的String

1.openJDK8的String 先来看下openJDK8的String的底层,如下图1.1所示: 图1.1 底层上使用的是char[],即char数组 每个char占16个bit,Character.SIZE的值是16。 2.openJDK9中的String 图2.1...

克虏伯
今天
4
0
UEFI 模式下如何安装 Ubuntu 16.04

作者:知乎用户 链接:https://www.zhihu.com/question/52092661/answer/259583475 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 针对UEFI模式下安装U...

寻知者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部