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级别的。但是其他线程可以访问非静态的同步方法或者代码块。

最新文章

  1. Mysql游标阻止执行最后一次
  2. WCF的三个名称/命名空间,你是否傻傻分不清楚?
  3. C#调用百度地图API经验分享(一)
  4. mysql用shell建100多字段表并导入
  5. BZOJ4129: Haruna’s Breakfast
  6. qml 相关的博客
  7. salt-ssh安装及简单使用
  8. UITableView多选删除
  9. Css的三大机制(特性):特殊性、继承、层叠详解
  10. PKCS#12
  11. VC之美化界面(内容覆盖十分全面,经典)
  12. C#的Random到底该怎么使用
  13. 网关 php-cgi fastcgi phpfpm
  14. 关于eclipse的一些问题
  15. Java开发知识之Java字符串类
  16. Android端高性能图像分类解决方案
  17. Atitit 创业好处 Atitit 为什么我们要创业
  18. HDU3306 Another kind of Fibonacci 矩阵
  19. React 60S倒计时
  20. git分支重命名

热门文章

  1. vicoapp使用备忘
  2. java 垃圾回收总结(1)
  3. 初识java——运算符和表达式以及注释
  4. sqlServer遇到的问题
  5. codechef Killing Monsters
  6. [转]FFMpeg框架代码阅读
  7. 【转】学习FFmpeg API – 解码视频
  8. 大型EMR电子病历源码三甲医院医疗信息管理系统软件网络版
  9. tensorflow1.0.0 弃用了几个operator写法
  10. Python进阶开发之网络编程,socket实现在线聊天机器人