唠唠SE的多线程-02——线程锁 原

2. 同步锁

什么是锁对象?

        每个java对象都有一个锁对象.而且只有一把钥匙.

如何创建锁对象:

        可以使用this关键字作为锁对象,也可以使用所在类的字节码文件对应的Class对象作为锁对象

  • 1. 类名.class
  • 2. 对象.getClass()

Java中的每个对象都有一个内置锁,只有当对象具有同步方法代码时,内置锁才会起作用,

    当进入一个同步的非静态方法时,就会自动获得与类的当前实例(this)相关的锁,该类的代码就是正在执行的代码。

    获得一个对象的锁也成为获取锁、锁定对象也可以称之为监视器来指我们正在获取的锁对象。

    因为一个对象只有一个锁,所有如果一个线程获得了这个锁,其他线程就不能获得了,直到这个线程释放(或者返回)锁。

    也就是说在锁释放之前,任何其他线程都不能进入同步代码(不可以进入该对象的任何同步方法)。

    释放锁指的是持有该锁的线程退出同步方法,此时,其他线程可以进入该对象上的同步方法。

1:只能同步方法(代码块),不能同步变量或者类

2:每个对象只有一个锁

3:不必同步类中的所有方法,类可以同时具有同步方法和非同步方法

4:如果两个线程要执行一个类中的一个同步方法,并且他们使用的是了类的同一个实例(对象)来调用方法,

        那么一次只有一个线程能够执行该方法,另一个线程需要等待,直到第一个线程完成方法调用。

        总结就是:一个线程获得了对象的锁,其他线程不可以进入该对象的同步方法。

5:如果类同时具有同步方法和非同步方法,那么多个线程仍然可以访问该类的非同步方法。

同步会影响性能(甚至死锁),优先考虑同步代码块。

6:如果线程进入sleep() 睡眠状态,该线程会继续持有锁,不会释放。

解决线程安全的方式1:同步代码块

解决线程安全的方式2:同步方法

加同步锁之后安全了,但是效率低了

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习网

JavaScript依赖注入的实现思路

JavaScript依赖注入的实现思路 如今各个框架都在模块化,连前端的javascript也不例外。每个模块负责一定的功能,模块与模块之间又有相互依赖,那么问...

2076
来自专栏友弟技术工作室

bash脚本编程

1843
来自专栏用户2442861的专栏

【深入Java虚拟机】之四:类加载机制

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17881581

571
来自专栏C语言C++游戏编程

老司机带你快速掌握C语言编程中存储类变量的四种类型

存储类定义C程序中变量和/或函数的范围(可见性)和生命周期。它们位于它们修改的类型之前。我们在C程序中有四种不同的存储变量

1602
来自专栏对角另一面

lodash源码分析之缓存方式的选择

每个人心里都有一团火,路过的人只看到烟。 ——《至爱梵高·星空之谜》 本文为读 lodash 源码的第八篇,后续文章会更新到这个仓库中,欢迎 star:po...

3419
来自专栏自动化测试实战

flask第十五篇——Response

37015
来自专栏Python中文社区

Python3.7 contextvars 初探

Python 3.7 于2018年6月27日发布,本篇文章将对其中新增模块contextvars 做初步介绍,为读者勾勒一个大概轮廓。

1435
来自专栏C/C++基础

C++中关于main函数的几点说明

main函数是C++程序的入口函数,C++标准要求main()函数的返回值类型为int。

792
来自专栏python3

python类(class)

类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例,把所有相似的功能都封装到一个类里,最理...

1043
来自专栏黑泽君的专栏

动态代理详解

动态代理它可以直接给某一个目标对象生成一个代理对象,而不需要代理类存在。     动态代理与代理模式原理是一样的,只是它没有具体的代理类,直接通过反射生成了一...

852

扫码关注云+社区