Java关键字synchronized学习笔记

1、synchronized定义

Java语言的关键字,可用来给对象方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这个段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍然可以访问该object中的非加锁代码块

注意:synchronized无法修饰单个对象,synchronized修饰的应该是对象+方法或者对象+代码块的组合。

对象+方法:直接修饰方法即可;这种方式中没有体现出对象,但其实该类的实例就是被锁的对象了。

public synchronized void A(){
		s("A");
	}

对象+代码块:这种方式就比较明显了,this就是指该类的实例,{}中的内容则是代码块。

public void A(){
		synchronized (this) {
			s("A");
		}
	}

上面两个例子是等价的。

2、打个比方来理解

synchronized其实就是一个游戏

游戏场景:一个大房子(对象),里面有多个房间(方法),有些是锁着的,有些是没锁的

游戏人物:管理员(JVM),玩家(线程)

游戏规则:

(1)没有上锁的房间可以随时使用,也可以多个玩家同时使用

(2)上了锁的房间只限一个玩家使用,而且只有一把钥匙可以打开

(3)钥匙可以跟管理员拿,若同时有多个玩家想拿同个钥匙,管理员会随机给其中一个玩家

(4)玩家用完房间后必须把钥匙归还管理员(即使想再次使用,也得先还管理员,再跟管理员要;如果其他玩家也要这个钥匙,则会随机给其中一个)

3、Android用到的地方

首先从定义就可以知道,synchronized只有在多线程的场景下才有存在的意义。

那么Android中用到多线程的地方,举个常见的例子,就是GridView异步加载本地图片。

由于加载图片挺耗时的,所以在同个线程中把多张图片一次加载完是很不明智的,况且本地图片可是很多的。

所以这时我们会考虑到使用线程池来加载图片。

那么线程多了自然也会面临一个问题:同个图片可能会被多个线程所加载,会产生什么问题?

事实上,这也是必然会出现的问题;比如你快速向上滑动图片列表(在图片非常多的情况下),然后又迅速向下滑动,这时如果之前正在加载的图片还没加载完,就会有新的线程来再加载那张图片;倒不至于报错,只是同张图片可能会被多次加载,界面上会有图片一闪的现象,而且挺浪费内存的。

而这时候,如果用上synchronized关键字,就可以轻松解决了~~至于怎么设计代码,这里就不多提,注意锁住的对象必须是同一个就行。

再次提醒:锁住不同对象没有任何意义,类似下面这样的代码都是无意义的!

public class Test implements Runnable{

	@Override
	public void run() {
		synchronized (this) {
			for (int i = 0; i < 5; i++) {
				System.out.println(Thread.currentThread().getName());
			}
		}
	}

	public static void main(String...arg){
		new Thread(new Test(),"A").start();
		new Thread(new Test(),"B").start();
	}

}

应该写成这样:

Test test = new Test();
		new Thread(test,"A").start();
		new Thread(test,"B").start();
时间: 2024-10-09 13:47:37

Java关键字synchronized学习笔记的相关文章

java/android 设计模式学习笔记(一)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑. PS:对技术感兴趣的同鞋加群544645972一起交流 设计模式总目录 java/android 设计模式学习笔记目录 特点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的使用很广泛,比如:线程池(threadpool).缓存(cache).对

java/android 设计模式学习笔记(5)---对象池模式

这次要介绍一下对象池模式(Object Pool Pattern),这个模式为常见 23 种设计模式之外的设计模式,介绍的初衷主要是在平时的 android 开发中经常会看到,比如 ThreadPool 和 MessagePool 等. 在 java 中,所有对象的内存由虚拟机管理,所以在某些情况下,需要频繁创建一些生命周期很短使用完之后就可以立即销毁,但是数量很大的对象集合,那么此时 GC 的次数必然会增加,这时候为了减小系统 GC 的压力,对象池模式就很适用了.对象池模式也是创建型模式之一,

Java多线程技术学习笔记(二)

目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和wait的区别 停止线程的方式 守护线程 线程的其他知识点 一.线程间的通信示例 返目录回 多个线程在处理同一资源,任务却不同. 假设有一堆货物,有一辆车把这批货物往仓库里面运,另外一辆车把前一辆车运进仓库的货物往外面运.这里货物就是同一资源,但是两辆车的任务却不同,一个是往里运,一个是往外运. 下面

java之jvm学习笔记十三(jvm基本结构)

java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成图形,所以只要你有耐心,仔细,认真,并发挥你的想象力,这一章之后你会充满自信.当然,不是说看完本章,就对jvm了解了,jvm要学习的知识实在是非常的多.在你看完本节之后,后续我们还会来学jvm的细节,但是如果你在学习完本节的前提下去学习,再学习其他jvm的细节会事半功倍. 为了让你每一个知识点都有迹

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

java基础知识《JAVA 核心技术》学习笔记(一)

一:数据类型 (1)java整形: 类型                         存储要求 int                              4字节 short                          2字节 long                           8字节 byte                           1字节 (2)浮点类型 类型                         储存要求 float            

java/android 设计模式学习笔记(3)---工厂方法模式

这篇来介绍一下工厂方法模式(Factory Method Pattern),在实际开发过程中我们都习惯于直接使用 new 关键字用来创建一个对象,可是有时候对象的创造需要一系列的步骤:你可能需要计算或取得对象的初始设置:选择生成哪个子对象实例:或在生成你需要的对象之前必须先生成一些辅助功能的对象,这个时候就需要了解该对象创建的细节,也就是说使用的地方与该对象的实现耦合在了一起,不利于扩展,为了解决这个问题就需要用到我们的工厂方法模式,它适合那些创建复杂的对象的场景,工厂方法模式也是一个使用频率很

【Java编程思想--学习笔记(一)】访问控制-包

Java编程思想–学习笔记(一) 访问控制(或隐藏具体实现)与"最初的实现并不恰当"有关. 1.包:库单元 我们之所以要导入包,就是要提供一个管理名字的空间机制. 每个java文件只能有一个public类.其他私有类为主public·类提供支持. 1.1 代码组织 与编译型语言不同,java可运行程序是一组可以打包并压缩成java文档文件(JAR,使用Java的jar文档生成器)的.class文件. 使用package和import关键字,使得不会出现名称冲突问题. 注意:java包的

java/android 设计模式学习笔记(2)---观察者模式

这篇来讲一下观察者模式,观察者模式在实际项目中使用的也是非常频繁的,它最常用的地方是GUI系统.订阅--发布系统等.因为这个模式的一个重要作用就是解耦,使得它们之间的依赖性更小,甚至做到毫无依赖.以GUI系统来说,应用的UI具有易变性,尤其是前期随着业务的改变或者产品的需求修改,应用界面也经常性变化,但是业务逻辑基本变化不大,此时,GUI系统需要一套机制来应对这种情况,使得UI层与具体的业务逻辑解耦,观察者模式此时就派上用场了. PS:对技术感兴趣的同鞋加群544645972一起交流. 设计模式