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同步简介的更多相关文章

  1. Java多线程简介

    Java多线程简介 Java中内置了对多线程的支持,让多线程的开发方便很多,但同时也带来了另外的复杂,线程间的交互以及很多的不确定性让多线程又显得很复杂.在此只是针对Java中多线程的基础做些说明,有 ...

  2. JAVA NIO 简介 (netty源码死磕1.1)

    [基础篇]netty 源码死磕1.1:  JAVA NIO简介 1. JAVA NIO简介 Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO.由于之前老的I/O类库是阻塞I/ ...

  3. java NIO简介

    1)java nio简介 nio 是 java New IO 的简称,在 jdk1.4 里提供的新 api . Sun 官方标榜的特性如有:为所有的原始类型提供 (Buffer) 缓存支持:字符集编码 ...

  4. 死磕 java同步系列之AQS起篇

    问题 (1)AQS是什么? (2)AQS的定位? (3)AQS的实现原理? (4)基于AQS实现自己的锁? 简介 AQS的全称是AbstractQueuedSynchronizer,它的定位是为Jav ...

  5. 死磕 java同步系列之volatile解析

    问题 (1)volatile是如何保证可见性的? (2)volatile是如何禁止重排序的? (3)volatile的实现原理? (4)volatile的缺陷? 简介 volatile可以说是Java ...

  6. 死磕 java同步系列之自己动手写一个锁Lock

    问题 (1)自己动手写一个锁需要哪些知识? (2)自己动手写一个锁到底有多简单? (3)自己能不能写出来一个完美的锁? 简介 本篇文章的目标一是自己动手写一个锁,这个锁的功能很简单,能进行正常的加锁. ...

  7. 死磕 java同步系列之CyclicBarrier源码解析——有图有真相

    问题 (1)CyclicBarrier是什么? (2)CyclicBarrier具有什么特性? (3)CyclicBarrier与CountDownLatch的对比? 简介 CyclicBarrier ...

  8. 死磕 java同步系列之Phaser源码解析

    问题 (1)Phaser是什么? (2)Phaser具有哪些特性? (3)Phaser相对于CyclicBarrier和CountDownLatch的优势? 简介 Phaser,翻译为阶段,它适用于这 ...

  9. 死磕 java同步系列之zookeeper分布式锁

    问题 (1)zookeeper如何实现分布式锁? (2)zookeeper分布式锁有哪些优点? (3)zookeeper分布式锁有哪些缺点? 简介 zooKeeper是一个分布式的,开放源码的分布式应 ...

随机推荐

  1. python JoinableQueue在生产者消费者项目中的简单应用

    class multiprocessing.JoinableQueue([maxsize]) JoinableQueue, a Queue subclass, is a queue which add ...

  2. Java工程师成神之路思维导图

    前面看Hollis的微信公众号更新了Java工程师成神之路的文档,感觉里面的内容清晰.齐全,可以用来审视自己,也能够知道自己在那些方面可以继续前行,想着有时间把它画下来,画下来之后分享出来. 主要内容 ...

  3. Jhipster 学习(一)jhipster构建项目

    如何安装jhipster 第一步:下载jdk  自己安装的1.8版本  (安装.环境变量配置略) 第二步:1.下载Eclipse (luna版 eclipse-4.4.1) 第三步:下载maven ( ...

  4. 前端技术之_CSS详解第五天

    前端技术之_CSS详解第五天 一.行高和字号 1.1 行高 CSS中,所有的行,都有行高.盒模型的padding,绝对不是直接作用在文字上的,而是作用在“行”上的. <!DOCTYPE html ...

  5. 登录以及发送微信消息itchat 库

    项目地址点这里 itchat   itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单. 使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人. 当然,该api的 ...

  6. 前端Mahsup异步依赖方式不能做业务数据依赖

    很久之前流行mashup方式做内容集成,之前为了IP定位的方便,引用了第三方的IP定位JS,然后根据其内容与服务器同步地址数据并写入Cookie,可是这种方式一旦,第三方的库反应缓慢时,就会出现大问题 ...

  7. 完整的WebRTC调用序列图

    说在前面的话:此图出自Rea-Time Communication with WebRTC: https://book.douban.com/subject/25849712/ 的第五章.

  8. 浅析fork()和底层实现

    记得以前初次接触fork()函数的时候,一直被“printf”输出多少次的问题弄得比较晕乎.不过,“黄天不负留心人".哈~ 终于在学习进程和进程创建fork相关知识后,总算是大致摸清了其中的 ...

  9. java实现堆结构

    一.前言 之前用java实现堆结构,一直用的优先队列,但是在实际的面试中,可能会要求用数组实现,所以还是用java老老实实的实现一遍堆结构吧. 二.概念 堆,有两种形式,一种是大根堆,另一种是小根堆. ...

  10. 老司机告诉你高质量的Java代码是怎么练成的?

    一提起程序员,首先想到的一定是"码农",对,我们是高产量的优质"码农",我们拥有超跃常人的逻辑思维以及不走寻常路的分析.判别能力,当然,我们也有良好的编码规范, ...