Java中使用synchronized和Lock对象获取对象锁

在并发环境下,解决共享资源冲突问题时,可以考虑使用锁机制。

1.对象的锁

所有对象都自动含有单一的锁。

JVM负责跟踪对象被加锁的次数。如果一个对象被解锁,其计数变为0。在任务(线程)第一次给对象加锁的时候,计数变为1。每当这个相同的任务(线程)在此对象上获得锁时,计数会递增。

只有首先获得锁的任务(线程)才能继续获取该对象上的多个锁。

每当任务离开一个synchronized方法,计数递减,当计数为0的时候,锁被完全释放,此时别的任务就可以使用此资源。

2.synchronized同步块

2.1同步到单一对象锁

当使用同步块时,如果方法下的同步块都同步到一个对象上的锁,则所有的任务(线程)只能互斥的进入这些同步块。

Resource1.java演示了三个线程(包括main线程)试图进入某个类的三个不同的方法的同步块中,虽然这些同步块处在不同的方法中,但由于是同步到同一个对象(当前对象 synchronized (this)),所以对它们的方法依然是互斥的。

Resource1.java

package com.zj.lock;import java.util.concurrent.TimeUnit;

public class Resource1 {    public void f() {       // other operations should not be locked...       System.out.println(Thread.currentThread().getName()              + ":not synchronized in f()");       synchronized (this) {           for (int i = 0; i < 5; i++) {              System.out.println(Thread.currentThread().getName()                     + ":synchronized in f()");              try {                  TimeUnit.SECONDS.sleep(3);              } catch (InterruptedException e) {                  e.printStackTrace();              }           }       }    }

public void g() {       // other operations should not be locked...       System.out.println(Thread.currentThread().getName()              + ":not synchronized in g()");       synchronized (this) {           for (int i = 0; i < 5; i++) {              System.out.println(Thread.currentThread().getName()                     + ":synchronized in g()");              try {                  TimeUnit.SECONDS.sleep(3);              } catch (InterruptedException e) {                  e.printStackTrace();              }           }       }    }

public void h() {       // other operations should not be locked...       System.out.println(Thread.currentThread().getName()              + ":not synchronized in h()");       synchronized (this) {           for (int i = 0; i < 5; i++) {              System.out.println(Thread.currentThread().getName()                     + ":synchronized in h()");              try {                  TimeUnit.SECONDS.sleep(3);              } catch (InterruptedException e) {                  e.printStackTrace();              }           }       }    }

public static void main(String[] args) {       final Resource1 rs = new Resource1();

new Thread() {           public void run() {              rs.f();           }       }.start();

new Thread() {           public void run() {              rs.g();           }       }.start();

rs.h();    }}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, 线程
, thread
, 多线程 java 同步 锁
, synchronized
, 同步
, public
, 线程递减锁
, timeunit
, 同步synchronized
, java synchronized
, synchronized java锁
, synchronized加锁
获取Thread
synchronized lock、synchronized和lock、lock与synchronized、synchronized lock2、synchronized 锁对象,以便于您获取更多的相关知识。

时间: 2024-10-03 08:46:52

Java中使用synchronized和Lock对象获取对象锁的相关文章

java中如何理解switch语句参数的对象.what

问题描述 java中如何理解switch语句参数的对象.what java中如何理解switch语句参数的对象.what switch (msg.what) { ......} 解决方案 msg是一个对象,what是其中的一个成员变量,没有什么特别的.

java中new关键词问题,涉及匿名对象。

问题描述 java中new关键词问题,涉及匿名对象. new 方法1.方法2=(new 方法1).方法2=对象1.方法2=对象2,这个对象2是匿名对象,这么理解对吗 解决方案 new 方法1.方法2 这是不合法的 要么是 new 对象().方法,要么写 new 类.对象() 解决方案二: java中没有什么匿名的对象,必须有变量保持着对变量的引用,否则这个对象就会被垃圾回收了. 解决方案三: 说的再详细一些,用到括号的必然是方法调用(包括构造函数,其实也是一个特殊的方法) 用到点的地方,就是调用

实例解析Java中的synchronized关键字与线程安全问题_实用技巧

首先来回顾一下synchronized的基本使用: synchronized代码块,被修饰的代码成为同步语句块,其作用的范围是调用这个代码块的对象,我们在用synchronized关键字的时候,能缩小代码段的范围就尽量缩小,能在代码段上加同步就不要再整个方法上加同步.这叫减小锁的粒度,使代码更大程度的并发. synchronized方法,被修饰的方法成为同步方法,其作用范围是整个方法,作用对象是调用这个方法的对象. synchronized静态方法,修饰一个static静态方法,其作用范围是整个

深入理解java中的synchronized关键字_java

synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行它包括两种用法:synchronized 方法和 synchronized 块. 1. synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法.如: 复制代码 代码如下: publ

Java中使用synchronized关键字实现简单同步操作示例_java

简单记录下java中synchronized关键字的使用方法. 在介绍之前需要明确下java中的每一个类的对象实例都有且只有一个锁(lock)和之相关联,synchronized关键字只作用于该锁,即可以认为synchronized只对java类的对象实例起作用. synchronized修饰函数 复制代码 代码如下: public synchronized aMethod(){ } 这就是最常用的情景,那么这个同步方法的用途是啥,为了方便就记作aMethod方法. 1.synchronized

java中反射机制通过字节码文件对象获取字段和函数的方法

pclass = Class.forName("get_class_method.Person"); //Field ageField = pclass.getField("age");//因为age成员变量是私有的,所以会产生NoSuchFieldException异常 Field ageField = pclass.getDeclaredField("age");//获得该对象反映此 Class 对象所表示的类或接口的指定已声明字段 Obje

使用GSON库将Java中的map键值对应结构对象转换为JSON_java

Map的存储结构式Key/Value形式,Key 和 Value可以是普通类型,也可以是自己写的JavaBean(本文),还可以是带有泛型的List. (GSON的GitHub项目页:https://github.com/google/gson) JavaBean 本例中您要重点看如何将Json转回为普通JavaBean对象时TypeToken的定义. 实体类: public class Point { private int x; private int y; public Point(int

为什么在Java中object.wait()/notify()方法必须在持有锁的情况下才能执行?

问题描述 为什么必须只有锁?我说的是为什么这么设计,不是说这样用的话就会抛异常.. 解决方案 只有两个线程抢一个资源的时候才存在两个线程同一时刻只能有一个线程得到资源,锁就是为了使两个线程抢同一个资源,如果没有锁,意思是两个线程不存在抢资源情况,那两个线程凭什么你等我 我等你,早就一起跑了.解决方案二:补充一下,wait逻辑通常是两步操作: (1)先判断特定的条件是否满足,如果不满足,(2)则进入wait.如果没有同步保护,就可能设置条件+唤醒的操作插入在这两步操作中间执行(1和2中间),造成w

java多线程:synchronized和lock比较浅析

转载:http://www.toutiao.com/a6392135944652587266/?tt_from=weixin&utm_campaign=client_share&app=news_article&utm_source=weixin&iid=7704173001&utm_medium=toutiao_ios&wxshare_count=1     synchronized是基于jvm底层实现的数据同步,lock是基于Java编写,主要通过硬件依