zoukankan      html  css  js  c++  java
  • 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并发之synchronized实现原理
    Untracked Files Prevent Checkout move or commit them before checkout
    java代码在开始事务后,先做了一个查询,再insert,此时会报: java.sql.SQLException: could not retrieve transation read-only status server
    Java 实例
    java队列——queue详细分析
    Jquery 获取table当前行内容
    Java list 分页(多种方式)
    获取当天的开始时间、结束时间等等的一个工具类
    java list按照元素对象的指定多个字段属性进行排序
    [译] OpenStack Kilo 版本中 Neutron 的新变化
  • 原文地址:https://www.cnblogs.com/zhangboyu/p/7452509.html
Copyright © 2011-2022 走看看