`

java中锁对象本身是可以修改的

    博客分类:
  • java
阅读更多
public class Apple {

    private int color;

    public Apple(int color)
    {
        this.color = color;
    }

    public int getColor() {
        return color;
    }

    //终止于这步
    public synchroized void  setColor(int color) {
        this.color = color;
    }

}

 

public class TestDeadLock implements Runnable{

     int flag = 1;
     static Apple o1 = (Apple) new Apple(3);  //资源1,也称为锁
     static Apple o2 = (Apple) new Apple(3);  //资源2,也称为锁

 public static void main(String[] args) {
      TestDeadLock td1 = new TestDeadLock();
      TestDeadLock td2 = new TestDeadLock();
      td1.flag = 1;
      td2.flag = 0;
      Thread t1 = new Thread(td1);
      Thread t2 = new Thread(td2);
      t1.start();
      t2.start();
 }


 public void run() {
      if(flag == 1){
           synchronized(o1)  //判断括号内对象是否在其他线程中锁定
           {
                try {
                      Thread.sleep(1000);
                } catch (InterruptedException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                }
                o2.setColor(8);  //发生死锁
                System.out.println("2:" + o2.getColor());
           }
      }

     if(flag == 0){
           synchronized(o2){
                System.out.println("1:" + o2.getColor());

                synchronized(o1){
                      System.out.println("t2 succeed");
                }
           }
      }
 }

}

 

当 Apple 类中setColor()方法前没有synchronized,则输出如下:

1:3
2:8
t2 succeed
当该方法前有synchronized,则构成了死锁。

由此可见:

(1)锁对象本身是可以修改的。

(2)当给一个方法前加上synchronized,则相当于synchronized(该方法所属的对象)。

(3)synchronized(锁)该语句会判断这个锁是否在某处已用,如果用,那么就阻塞当前线程。

分享到:
评论

相关推荐

    synchronized锁原理分析(一、从Java对象头看synchronized锁的状态)

    synchronized关键字在Java中扮演着重要的角色,它是Java实现同步的基础,确保了多线程环境下的数据一致性。不同于基于JDK实现的Lock接口(如ReentrantLock),synchronized是直接由JVM支持的,其底层依赖于操作系统...

    java锁机制详解.pdf

    - **同步代码块**更灵活,可以指定锁对象,并且只对特定代码进行同步,减少锁的粒度,提高并发性能。 - **同步方法**锁住的是对象本身,所有对该对象的synchronized方法调用都会互斥。如果一个类的所有方法都需要...

    Java面试宝典2018版

    2. Java中没有goto语句。 3. “&”是逻辑与操作符,用于所有情况的逻辑运算;“&&”是短路与操作符,仅在第一个条件为false时才会计算第二个条件。 4. Java中跳出多重循环通常使用标签(label)配合break语句。 5. ...

    corejava_面试题

    Java基础知识讲解与面试题分析: 1. Java源文件中是否可以...Java中可以通过继承Thread类、实现Runnable接口以及使用Callable接口和FutureTask类来实现多线程。同步可以通过synchronized关键字或者显式锁Lock类实现。

    Java面经.适用于校招

    - Java中的访问修饰符,用来控制类、接口、变量、方法和构造器的访问级别。 1.25 Object - Object是Java类层次结构的根类,所有Java类都直接或间接继承自Object类。 1.26 equals和==的区别 - ==用于比较两个对象的...

    【Java并发编程】Synchronized关键字实现原理.doc

    Synchronized 锁对象是 Java 虚拟机中的一种同步机制,可以实现同步锁。Synchronized 锁对象可以分为两部分:Java 对象内存布局和 Java 锁结构信息。 3.1、Java 对象内存布局 Java 对象内存布局是指 Java 对象在...

    JAVA单线程多线程

    `synchronized`还可以用来修饰代码块,指定一个同步监视器(通常是对象实例本身),只有获得了该监视器的锁,才能执行代码块内的代码。这种方式更为灵活,可以根据实际需求控制锁的范围。示例代码如下: ```java ...

    Java Core及底层面试问题.pdf

    - 内部类可以避免修改接口而实现同一个类中两种同名方法的调用。 4. **继承**: - 子类可以从父类继承public和protected修饰的属性和方法,无论子类和父类是否在同一个包内。 - 子类还可以继承默认权限修饰符修饰...

    超级有影响力霸气的Java面试题大全文档

     Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,...

    java题库,超赞

    10. final关键字用于修饰变量时,表示变量一旦被赋值后,其引用不能被改变,但引用的对象可以是可变的。 11. “==”比较的是引用是否相同,而equals方法比较的是对象的内容是否相同。 12. 静态变量属于类本身,而...

    java关键字Synchronized详解

    - **同步代码块**:可以指定锁对象,锁的是给定的对象,提供了更大的灵活性。 3. **synchronized的实现** - 在Java中,每个对象都有一个监视器锁(monitor)。当监视器锁被占用时,对象进入锁定状态,线程执行`...

    java面经_加水印.pdf

    本文主要围绕Java面试中常...通过反射,可以获取类的元数据,访问和修改类及对象的属性,调用方法,加载类等。 以上知识点是Java程序员在面试中常被问及的内容,掌握这些知识点对于通过Java相关职位的面试至关重要。

    高级Java经典面试题2019

    控制反转(Inversion of Control,IoC)是一种设计模式,它提倡将对象的创建、组装和管理责任交给外部容器,而不是由对象本身来管理。在Spring框架中,这种模式通过依赖注入(Dependency Injection,DI)来实现。 #...

    java操作word(包含书签插值)

    在Java中,可以通过查找书签并替换其内容来实现动态数据插入。例如,在Apache POI中,可以使用`XWPFDocument`的`getBookmarks()`方法获取文档中的所有书签,然后使用`XWPFBookmark`对象的`getBody()`或`getPart()`...

    2022美的集团Java开发岗位笔试题目.docx

    在多线程环境下,为了避免多个线程同时修改同一个资源而导致的数据不一致问题,可以使用对象锁(synchronized关键字)来实现对共享资源的互斥访问。`synchronized`可以作用于方法或者代码块,确保同一时间只有一个...

    JAVA面试宝典2013版

    5. switch语句在Java中可以用于byte和short类型以及枚举类型(Java 5之后),但是不可以用于long和String类型。不过,可以通过String类的valueOf()方法将字符串转换为字符序列后使用。 6. 对于short类型变量的运算...

    Java复习大纲面试题.doc

    在Java中,使用`break`关键字配合标签(label)可以跳出多重循环,例如`break label;`。 5. **Java数据类型**: Java的数据类型分为两类:基本数据类型(如int、char、boolean)和引用数据类型(如类、接口和数组...

    Java面试宝典2013_PDF版.pdf

    修饰对象引用时,引用变量不可指向其他对象,但是对象本身的内容是可以修改的。 11. "=="和equals方法究竟有什么区别? "=="比较的是两个变量的引用是否相同,即它们是否指向内存中的同一个位置;equals方法默认...

Global site tag (gtag.js) - Google Analytics