同步针对的是多线程。同步的方法或代码块同时只能由一个线程执行。

Java支持多线程来执行。这可能会导致两个或多个线程访问同一个字段或对象。同步是一个使所有并发执行的线程同步的过程。同步避免了由于共享内存视图不一致而导致的内存一致性错误。当一个方法被声明为同步时,如果一个线程正在执行同步方法,线程保存该方法对象的监视器(monitor),同时该线程被阻塞,直到该线程释放监视器(monitor)为止。

同步在Java中使用synchronized关键字实现。可以在类中定义的方法或块使用同步关键字。关键字不能与类定义中的局部变量一起使用。

对象级别锁

对象级别锁是一种当您想同步非静态方法或非静态代码块时,只有一个线程能够在类的给定实例上执行代码块的机制。应该始终这样做,使实例级数据线程安全。这可以做如下:

public class DemoClass
{
public synchronized void demoMethod(){}
}

public class DemoClass
{
public void demoMethod(){
synchronized (this)
{
//other thread safe code
}
}
}

public class DemoClass
{
private final Object lock = new Object();
public void demoMethod(){
synchronized (lock)
{
//other thread safe code
}
}
}

类级别锁

类级锁定防止在运行时多个线程进入所有可用实例中的同步块中。这意味着,如果在运行时有100 DemoClass实例,那么只有一个线程可以在同一时间在任何一个实例上执行demomethod(),对其他线程而言所有其他的实例将被锁。这样做总是为了使静态数据线程安全。

public class DemoClass
{
public synchronized static void demoMethod(){}
}

public class DemoClass
{
public void demoMethod(){
synchronized (DemoClass.class)
{
//other thread safe code
}
}
}

public class DemoClass
{
private final static Object lock = new Object();
public void demoMethod(){
synchronized (lock)
{
//other thread safe code
}
}
}

一些重要的事项

  1. 在Java中为了保证没有两个线程可以同时执行一个同步的方法,这就需要相同的锁。
  2. 同步关键字只能用于方法,代码块和final字段。这些方法或块既可以是静态的也可以是非静态的。
  3. 当有一个线程进入Java同步方法或块的时候获取锁,离开Java同步方法或块的时候释放锁。线程完成同步方法,或由于任何错误或异常,锁都会被释放。
  4. Java同步关键词是可重入的,这意味着如果一个Java同步方法调用另一个需要相同的锁的同步方法,当前线程持有锁,能直接进入,不需要有获取锁。
  5. 如果使用Java同步块的对象为空Java同步将抛出NullPointerException。例如,在上面的代码示例,如果锁被初始化为null,同步(锁)将抛出NullPointerException。
  6. Java同步会消耗您的应用程序性能。所以绝对必要时才使用同步。另外,考虑使用同步代码块来同步代码中的关键部分。
  7. 静态同步和非静态同步方法可能同时或并发地运行,因为它们锁定在不同的对象上。
  8. 根据Java语言规范不能使用同步关键词在构造函数上,这是违法的,会导致编译错误。
  9. 不要同步非final字段。因为非final字段的引用可能随时改变,不同的线程可能在不同的对象上同步,即根本不同步。最好是使用字符串类,它已经是不可变的,并且声明为最终的。

Happy Learning !!

对象级别锁 vs 类级别锁 – Java的更多相关文章

  1. 对象级别锁 vs 类级别锁(Java)

    前言 对于多线程(并发)和Spring Boot这两块在同步进行学习中,在看到使用synchronized关键字使操作同步时,看到和C#中不一样的东西,所以这里呢,就深入学习了下,若有错误之处,还望指 ...

  2. Java synchronized对象级别与类级别的同步锁

    Java synchronized 关键字 可以将一个代码块或一个方法标记为同步代码块.同步代码块是指同一时间只能有一个线程执行的代码,并且执行该代码的线程持有同步锁.synchronized关键字可 ...

  3. jQuery插件开发全解析,类级别与对象级别开发

    jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...

  4. Jquery类级别与对象级别插件开发

    jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...

  5. Java锁Synchronized,对象锁和类锁举例

    Java的锁分为对象锁和类锁. 1. 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内针对该对象的操作只能有一个线程得到执行.另一个线程必须 ...

  6. Java锁Synchronized对象锁和类锁区别

    java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁.线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁.获得内置锁的唯一途径就是进入这个锁的保 ...

  7. Java对象锁和类锁全面解析(多线程synchronized关键字)

    最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念.最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没 ...

  8. java的对象锁和类锁

    在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法. 因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识. j ...

  9. java 对象锁和类锁的区别(转)

    java 对象锁和类锁的区别   转自; ) ); ; ) ); 上述的代码,第一个方法时用了同步代码块的方式进行同步,传入的对象实例是this,表明是当前对象,当然,如果需要同步其他对象实例,也不可 ...

随机推荐

  1. [进程管理] Linux中Load average的理解

    Load average的定义 系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树.如果一个进程满足以下条件则其就会位于运行队列中: - 它没有在等待I/O操作的结果 - 它没有主动进入等待状 ...

  2. CSS3弹性伸缩布局(中)——flexbox布局

    混合过渡版 上一篇我们主要讲了旧版box布局,今天这篇主要讲flexbox布局. 混合版本的Flexbox模型是2011年提出的工作草案,主要是针对IE10浏览器实现的伸缩布局效果,其功能和旧版本的功 ...

  3. Windows7下安装IIS

    1.点击开始→控制面板,然后再点击程序,勿点击卸载程序,否则到不了目标系统界面. 2.然后在程序和功能下面,点击打开和关闭windows功能. 3.进入Windows功能窗口,然后看到internet ...

  4. Mycil命令行MySQL语法高亮和自动补全工具

    MyCli 是MySQL,MariaDB和Percona的命令行界面,具有自动完成和语法高亮的功能. 其效果如图: 那么我们应该怎么安装它呢,这里附上windows的安装方法. 在命令行下输入 pip ...

  5. 在Visual Studio中入门F#

    写在前面的话 个人由某方面的兴趣需要学习 F#,网络上有关F#的中文资料很少,微软官方有很不错的文档,但是很可惜的是绝大部分的章节都是英文的.个人是一位.NET爱好者,想自己将 F# 的官方文档翻译出 ...

  6. 1012 u Calculate e

    A simple mathematical formula for e iswhere n is allowed to go to infinity. This can actually yield ...

  7. Java内存模型四

    volatile的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特别.理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个锁对这些单个 ...

  8. OpenCV探索之路(七):霍夫变换

    我们如何在图像中快速识别出其中的圆和直线?一个非常有效的方法就是霍夫变换,它是图像中识别各种几何形状的基本算法之一. 霍夫线变换 霍夫线变换是一种在图像中寻找直线的方法.OpenCV中支持三种霍夫线变 ...

  9. Hadoop中Hbase的体系结构

    HRegion 当一张表中的数据特别多的时候,HBase把表拆成多个块,每个块就是一个HRegion,每个region中包含这个表里的所有行 HRegionServer 数据库的数据存在HDFS文件系 ...

  10. 使用IDEA部署Myeclipse项目

    IDEA的下载和FREE注册 IDEA 下载地址:IDEA最新版本下载地址 IDEA 注册方法:注册方法 导入Myeclipse项目 IDEA主界面,选择Open,如下图所示 选择Myeclipse项 ...