0 0

JAVA里synchronized同步代码块的一点疑问15

代码如下:

public class SomeObj {
    public  void print(int i){
        System.out.println(Thread.currentThread().getName()+DateHelper.getNow()+ " " + i);
        try {
            wait(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();  
        }
    }
}
public 
class ThreadA extends Thread{
   private SyncTest st;
   public ThreadA(SyncTest syncTest){
        this.st=syncTest;
   }

   public void run(){
        st.methodA();
   }
}
public class SyncTest {
    private volatile int i;
    
    public static void main(String[] args) throws Exception {
        new SyncTest().startUp();
    }

    public void startUp(){
        for (int a = 0; a < 10; a++) {
            new ThreadA(this).start();
        }
    }

    private  SomeObj obj = new SomeObj();

    public void methodA() {
        synchronized (obj) {
           obj.print(i);

System.out.println(Thread.currentThread().getName()+DateHelper.getNow() + " god is a girl");
            i++;

        }
    }

}

===============================================
        synchronized (obj) {  运行结果显示,同步代码块并没有被锁住,而把这行代码的obj替换成this或者随便其他的instance对象,都能锁住代码块。求解?

问题补充:public  void print(int i){ //obj替換成this的時候,這行代碼前加syncronized
2014年11月26日 14:30

1个答案 按时间排序 按投票排序

0 0

采纳的答案

因为wait(1000)会将当前对象obj的控制权(即锁)交出去1秒
可以用Thread.sleep(1000)

2014年11月26日 16:12

相关推荐

    河工大 java实验课程资源

    6. **多线程**:Java内置对多线程的支持,实验课程可能包含线程的创建、同步控制(synchronized关键字、wait()、notify())等内容,以实现并发编程。 7. **网络编程**:Java的Socket编程是网络通信的基础,实验可能...

    JAVA解惑

    Java提供了丰富的同步机制,如synchronized关键字、wait()和notify()方法、Lock接口及其实现类,帮助开发者处理线程安全问题。 另外,Java的I/O流和NIO(New IO)系统是处理输入输出的关键部分。I/O流允许程序读取...

    面试官,别挂电话,Synchronized,我还能说上半小时。

    这段代码的字节码中,可以看到`monitorenter`和`monitorexit`指令,它们分别对应于进入和退出同步代码块的操作,确保了i++操作的原子性。 总的来说,Synchronized是Java中实现线程同步的重要工具,其背后的锁机制...

    Java并发编程实践

    - **同步与锁**: 使用`synchronized`关键字可以实现方法级或代码块级的同步,从而确保同一时刻只有一个线程可以访问特定资源。 - **死锁问题**: 当两个或更多线程相互等待对方持有的锁时,会发生死锁。合理设计锁...

    JAVA面试题解惑系列

    多线程编程是Java的一个强项,面试中可能会讨论线程的创建、同步机制(如synchronized、Lock)、线程安全问题以及并发设计模式。 11. **运算符**: 了解各种运算符的优先级、作用以及特殊用法,如位运算符在处理...

    java语言程序设计课件最新版的

    线程的创建、同步、通信(如synchronized关键字、wait()、notify())等内容将在课件中详细阐述。 7. **泛型**:泛型引入了类型参数的概念,提高了代码的类型安全性和重用性。课件将讲解泛型类、泛型方法、通配符、...

    java学习笔记2

    9. **多线程**:创建和管理线程,了解同步机制,如synchronized关键字和wait()、notify()方法。 10. **网络编程**:学习Socket编程,实现客户端和服务器端的通信。 11. **反射机制**:通过反射API动态获取类的信息...

    Java笔试时可能出现问题及其答案

    同步机制的实现主要有`synchronized`关键字、`wait()`、`notify()`和`notifyAll()`方法。 6. 类的执行顺序:在创建子类对象时,会先执行父类的构造器,然后执行子类的构造器。在上述代码中,输出顺序是"FatherClass...

    java,android面试题

    - **多线程**:线程的创建方式(Thread类和Runnable接口),线程同步机制(synchronized、wait/notify、Lock、Condition)。 - **集合框架**:List、Set、Map的区别,ArrayList、LinkedList、HashSet、HashMap的...

    javaOne:我参加哈佛计算机科学课程的工作,介绍Java。 本文中的工作没有提出程序的提示,但如果您有任何疑问,建议您与我们联系。

    同步机制,如synchronized关键字和Lock接口,用于控制对共享资源的访问,防止数据不一致。 最后,JavaOne是一个知名的Java技术大会,这里提到的"javaOne-master"可能是该会议的资料或项目。它可能包含了一些课程的...

    JAVA:在该存储库中解释了Java的各种概念,目的是使读者爱上Java。

    Java提供了Thread类和Runnable接口来创建和管理线程,同时还有synchronized关键字、wait()、notify()等机制来处理线程间的同步和通信,防止数据竞争问题。 JDBC(Java Database Connectivity)是Java与数据库交互的...

    Java-practice-question

    同步机制,如synchronized关键字、wait()和notify()方法,用于避免线程间的竞态条件和死锁,确保程序的正确性。 网络编程在Java中也得到了很好的支持,Socket编程允许开发网络应用程序。理解TCP和UDP协议,以及如何...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段20讲、同步代码块以及同步方法之间的区别和关系.mp4 │ 高并发编程第一阶段21讲、通过实验分析This锁的存在.mp4 │ 高并发编程第一阶段22讲、通过实验分析Class锁的存在.mp4 │ 高并发编程...

    Python使用functools实现注解同步方法

    在Java中,可以通过synchronized关键字轻松实现方法的同步,但在Python中并没有内建的同步关键字。因此,开发者通常使用threading模块中的Lock对象来控制线程对共享资源的访问,确保同一时刻只有一个线程可以执行被...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段20讲、同步代码块以及同步方法之间的区别和关系.mp4 │ 高并发编程第一阶段21讲、通过实验分析This锁的存在.mp4 │ 高并发编程第一阶段22讲、通过实验分析Class锁的存在.mp4 │ 高并发编程...

    Module-14-CS-A

    8. **多线程**:Java支持并发编程,学习者将学习如何创建和管理线程,以及如何使用同步机制(如synchronized关键字和wait/notify机制)来避免并发问题。 9. **异常和错误分类**:Java区分了异常(Exception)和错误...

    CMP112-test1:第一次测试的存储库

    7. **多线程编程**:学习如何创建和管理线程,理解同步和互斥的概念,使用synchronized关键字和Lock接口。 8. **单元测试**:理解JUnit框架的使用,编写测试用例以确保代码的正确性。 9. **版本控制**:熟悉Git的...

Global site tag (gtag.js) - Google Analytics