Java同步简介
Java同步
Java中同步一直都是很重要的问题,对于初学者来说也是不太容易能理解的问题。特在此记录一下有关Java中同步和锁的知识。主要涉及到同步的概念以及Java中解决的办法和简单的例子。有关锁Lock中的内容不在此做说明。
同步
为什么需要同步
这个问题不难回答。当牵扯到同步问题的时候,就离不开多线程了。简单举个例子,桌子上有一台2016新款MacBook pro,我和女朋友都想要去玩,我们俩同时伸向了那台电脑,后果可想而知(当然是我地上坐着玩手机去了!),我们俩都在抢那台电脑,谁也玩不了。这时候该怎么办?我们会约定好,一人半个小时,我在玩电脑的时候你拿着手机玩……就这样一人一段时间的玩。分析一下,电脑就是被竞争的资源,我和女朋友是两个线程,关于怎么玩电脑就需要同步来解决了,要不然不就打起来了么。
同步就是要多个运行的线程在一起良好的工作,在访问同一个资源时不会造成资源的错误或者混乱。
Java中同步的解决办法
Java中内置了synchronized关键字来控制线程的同步。synchronized关键字可以修饰方法或者代码块,当有一个线程进入到了synchronized方法或者代码块中的时候,其他的线程就不能进入到此方法或者代码块中,必须等待刚才的线程完成退出synchronized方法或者代码块之后,等待的方法才能去执行。就是我女票玩电脑的时候,我就不能玩,必须等着。
锁
synchronized其实就是实现锁的功能。Java中每个对象都有一个内置锁,每次需要访问同步方法或者同步块的时候,必须获得相应的锁。要不然等待的线程怎么能知道这块代码是不是被其他线程在用呢。
同步的几种情况
synchronized修饰一个方法
修饰一个方法时,能够保证同一时刻最多只有一个线程执行该方法中的代码。此时锁的是当前实例对象,如果该对象还有其他的synchronized方法,也不能被其他线程访问,因为当前对象的锁只有一个。但是对于该对象其他的非synchronized方法其他线程则可以访问。
synchronized修饰代码块
此时代码块应该用synchronized(this)来修饰,锁的也是当前实例对象,该对象其他的同步方法和同步块也不能被其他线程访问。
synchronized修饰静态方法
静态方法是属于类的而不属于对象的,所以静态方法的锁是类对象。一个synchronized静态方法被访问时,其他线程不能访问这个类的所有对象的同步方法。这个锁是类级别的。
synchronized(.class)修饰的代码块
线程进入synchronized(.class)修饰的代码块,会将整个类的所有这个synchronized(.class) 同步代码块锁定,其他线程没有办法访问synchronized(.class)修饰的代码块。属于class级别的。但是其他线程可以访问非静态的同步方法或者代码块。
Java同步简介的更多相关文章
- Java多线程简介
Java多线程简介 Java中内置了对多线程的支持,让多线程的开发方便很多,但同时也带来了另外的复杂,线程间的交互以及很多的不确定性让多线程又显得很复杂.在此只是针对Java中多线程的基础做些说明,有 ...
- JAVA NIO 简介 (netty源码死磕1.1)
[基础篇]netty 源码死磕1.1: JAVA NIO简介 1. JAVA NIO简介 Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO.由于之前老的I/O类库是阻塞I/ ...
- java NIO简介
1)java nio简介 nio 是 java New IO 的简称,在 jdk1.4 里提供的新 api . Sun 官方标榜的特性如有:为所有的原始类型提供 (Buffer) 缓存支持:字符集编码 ...
- 死磕 java同步系列之AQS起篇
问题 (1)AQS是什么? (2)AQS的定位? (3)AQS的实现原理? (4)基于AQS实现自己的锁? 简介 AQS的全称是AbstractQueuedSynchronizer,它的定位是为Jav ...
- 死磕 java同步系列之volatile解析
问题 (1)volatile是如何保证可见性的? (2)volatile是如何禁止重排序的? (3)volatile的实现原理? (4)volatile的缺陷? 简介 volatile可以说是Java ...
- 死磕 java同步系列之自己动手写一个锁Lock
问题 (1)自己动手写一个锁需要哪些知识? (2)自己动手写一个锁到底有多简单? (3)自己能不能写出来一个完美的锁? 简介 本篇文章的目标一是自己动手写一个锁,这个锁的功能很简单,能进行正常的加锁. ...
- 死磕 java同步系列之CyclicBarrier源码解析——有图有真相
问题 (1)CyclicBarrier是什么? (2)CyclicBarrier具有什么特性? (3)CyclicBarrier与CountDownLatch的对比? 简介 CyclicBarrier ...
- 死磕 java同步系列之Phaser源码解析
问题 (1)Phaser是什么? (2)Phaser具有哪些特性? (3)Phaser相对于CyclicBarrier和CountDownLatch的优势? 简介 Phaser,翻译为阶段,它适用于这 ...
- 死磕 java同步系列之zookeeper分布式锁
问题 (1)zookeeper如何实现分布式锁? (2)zookeeper分布式锁有哪些优点? (3)zookeeper分布式锁有哪些缺点? 简介 zooKeeper是一个分布式的,开放源码的分布式应 ...
随机推荐
- JDBC 连接Oracle
工作中,我们遇到的操作数据库代码都是封装起来的,今天我们就来看看,最基本的利用JDBC来操作数据库. JDBC连接数据库主要有三个步骤: 第一步:加载数据库驱动.通常我们使用Class.forName ...
- 64位ubuntu安装N64模拟器mupen64
我们知道在windows平台下模拟器多如牛毛,N64的模拟器也不例外.而linux下对于想玩N64的童鞋们有啥好办法呢?我通过度娘找到一款开源的N64模拟器mupen64,其官方网址为:http:// ...
- C# 添加、读取Word脚注尾注
脚注和尾注是对文本的补充说明.脚注一般位于页面的底部,可以作为文档某处内容的注释:尾注一般位于文档的末尾,列出引文 的出处等.在本示例中将介绍如何来添加或删除Word脚注. 工具使用:Free Spi ...
- Emmet之html语法
一.简写语法 Emmet 用和 CSS 选择器相似的语法来描述元素的嵌套层级关系和属性,实现 HTML/XML/CSS 等代码的智能自动补全. 其通过文件名后缀识别文件类型,从而使用对应的自动补全语法 ...
- Spring Cloud项目中通过Feign进行内部服务调用发生401\407错误无返回信息的问题
问题描述 最近在使用Spring Cloud改造现有服务的工作中,在内部服务的调用方式上选择了Feign组件,由于服务与服务之间有权限控制,发现通过Feign来进行调用时如果发生了401.407错误时 ...
- 《转》iOS 平台 Cocos2d-x 项目接入新浪微博 SDK 的坑
最近在做一个 iOS 的 cocos2d-x 项目接入新浪微博 SDK 的时候被“坑”了,最后终于顺利的解决了.发现网上也有不少人遇到一样的问题,但是能找到的数量有限的解决办法写得都不详细,很难让人理 ...
- 6.4 Schema 设计对系统的性能影响
前面两节中,我们已经分析了在一个数据库应用系统的软环境中应用系统的架构实现和系统中与数据库交互的SQL 语句对系统性能的影响.在这一节我们再分析一下系统的数据模型设计实现对系统的性能影响,更通俗一点就 ...
- Angular TypeScript开发环境集成jQuery扩展插件
集成步骤: 1.安装jquery极其扩展插件库ts定义文件 npm install jquery --save npm install --save-dev @types/jquery npm ins ...
- Web安全测试工具小集
从此文开始搬家CSDN的博客 本文内容全部节选自<Ajax Security>第14章内容推荐工具: 模糊黑盒测试工具(Fuzzer): Popular free fuzzers incl ...
- AngularJS - 使用RequireJS还是Browserify?
http://www.html-js.com/article/2126 AngularJS - 使用RequireJS还是Browserify? AngularJS之所以吸引了很多开发者的关注,很大一 ...