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

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. 【算法系列学习】Dijkstra算法变形 [kuangbin带你飞]专题四 最短路练习

    https://vjudge.net/contest/66569#problem/B 类试题:noip2013 货物运输 POJ 1797 Heavy Transportation 方法一:Dijks ...

  2. 【BZOJ1001】[BeiJing2006]狼抓兔子

    挺简单一个题,最小割模板 我的感觉就是可能建图的时候会比较麻烦吧,毕竟三个方向. #include <cctype> #include <climits> #include & ...

  3. IOS中的绘图Quartz2D

    drawRect 方法的使用 常见图形的绘制:线条.多边形.圆 绘图状态的设置:文字颜色.线宽等 图形上下文状态的保存与恢复 图形上下文栈 Quartz 2D是一个二维绘图引擎,同时支持IOS和MAC ...

  4. 【Android Widget】FragmentTabHost

    android.support.v4包里面提供了FragmentTabHost用来替代TabHost,FragmentTabHost内容页面支持Fragment,下面我们就通过示例来看他的用法 效果图 ...

  5. NodeJS+Express+MongoDB 简单实现数据录入及回显展示【适合新人刚接触学习】

    近期在看NodeJS相关 不得不说NodeJS+Express 进行网站开发是很不错,对于喜欢玩JS的来说真是很好的一种Web开发组合 在接触NodeJS时受平时Java或者C#中API接口等开发的思 ...

  6. Numpy的使用

    Numpy的主要功能: 可以观察以上的规律,会发现,代码类型的简写,计量都是以8作为起始1的. # -*- coding: utf-8 -*- #向量相加-Python def pythonsum(n ...

  7. Azure Event Bus 技术研究系列1-Event Hub入门篇

    前两个系列研究了Azure IoT Hub和Azure Messaging.最近准备继续研究Azure Event Bus,即Azure的事件中心.首先, Azure Event Hub的官方介绍: ...

  8. $>_<$

    Hello word! 从jdk环境变量的配置,myeclipse的安装,tomcat的部署和使用,面向对象的编程思想,什么是java. 思维从模糊到清晰,一路摸索,不见泰山!

  9. Android studio 3.0 引起的 outputFile sync failed:not vaild

    我们大多使用 android studio 改变生成安装包命名会用以下方式: applicationVariants.all { variant -> variant.outputs.each ...

  10. Ubuntu安装中文输入法

    如果你没有因为各种尝试搞乱了Ubuntu系统的话: 1. 在All Settings 里找到 Language Support, Install/Remove Languages里安装Chinese ...