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是一个分布式的,开放源码的分布式应 ...
随机推荐
- 恶补web之一:html学习(1)
发现以前欠下的web知识太多鸟,只有重头开始好好学吧,恶补第一站就是html知识啦! html指的是超文本标记语言,它不是编程语言,而是一种标记语言;标记语言是一套标记标签(markup tag),h ...
- 【JDK1.8】JUC——AbstractQueuedSynchronizer
一.前言 在上一篇中,我们对LockSupport进行了阅读,因为它是实现我们今天要分析的AbstractQueuedSynchronizer(简称AQS)的基础,重新用一下最开始的图: 可以看到,在 ...
- Tornado、Bottle以及Flask
最近接手一个Tornado项目代码,项目要在原有基础上做很大扩展,为了更好地吃透并扩展好这个项目,就对Tornado以及比较轻型的Bottle.Flask这些框架一一作了调研.其实若干年前做第一个Py ...
- threesum
算法题 问题描述:在一些给定的数中,找到三个数,他们相加的和是0,并且这三个数的组合是不能重复的 例子: input [-1, 0, -1, 2, 1] Output [[-1, 1 ,0], [-1 ...
- Java注解处理器--编译时处理的注解
1. 一些基本概念 在开始之前,我们需要声明一件重要的事情是:我们不是在讨论在运行时通过反射机制运行处理的注解,而是在讨论在编译时处理的注解.注解处理器是 javac 自带的一个工具,用来在编译时期扫 ...
- (三)SpringBoot基础篇- 持久层,jdbcTemplate和JpaRespository
一.介绍 SpringBoot框架为使用SQL数据库提供了广泛的支持,从使用JdbcTemplate的直接JDBC访问到完整的"对象关系映射"技术(如Hibernate).Spri ...
- 【热身】github的使用
GitHub 可以托管各种Git版本库,并提供一个web界面,但与其它像 SourceForge或Google Code这样的服务不同,GitHub的独特卖点在于从另外一个项目进行分支的简易性.为一个 ...
- zlib 压缩输出缓冲区 overflow 问题
[TOC] 问题 后台服务传包太大时,我们框架可以使用 zlib 库对响应进行压缩:在这次服务调试过程中,使用 zlib compress2 以 Z_BEST_COMPRESSION 模式进行压缩时, ...
- React从入门到放弃之前奏(1):webpack4简介
接触webpack是好久之前的事情了,最近看了下webpack没想到都到4了. webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler). 会创建1个 ...
- thymeleaf 货币格式化 数字格式化问题
格式化数字对象 ${'¥'+#numbers.formatDecimal(pro.price,0,'COMMA',2,'POINT')} ${'¥'+#numbers.formatDecimal(pr ...