当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法(转)

简介: 对象的synchronized方法不能进入了,但它的其他非synchronized方法还是可以访问的 对每一个class只有一个thread可以执行synchronized static method。

对象的synchronized方法不能进入了,但它的其他非synchronized方法还是可以访问的

对每一个class只有一个thread可以执行synchronized static method。每个class的instance只有一个thread可以执行synchronized method。任意数目的thread可以执行非synchronized method——不管是否是static。

 

情况一:

当一个线程进入一个对象的一个synchronized方法后,其它线程访问该对象的非同步方法。

代码如下:

package com.mutithreading.Object;

 

public class InvokedObject

{

   

    public synchronized void synchronizedMethod()

    {

       System.out.println("Invoked synchronizedMethod !") ;

       try {

           Thread.sleep(10000) ;

       } catch (InterruptedException e) {

           e.printStackTrace();

       }

    }

   

    public void generalMethod()

    {

       System.out.println("Invoked generalMethod ...") ;

    }

 

}

 

 

package com.mutithreading.threads;

import com.mutithreading.Object.InvokedObject;

 

public class ThreadOne implements Runnable {

 

    private InvokedObject object ;

   

    public ThreadOne(InvokedObject object)

    {

       this.object = object ;

    }

   

    public void run() {

      

       object.synchronizedMethod() ;

 

    }

 

}

 

 

package com.mutithreading.threads;

import com.mutithreading.Object.InvokedObject;

 

public class ThreadTwo implements Runnable {

 

    private InvokedObject object ;

   

    public ThreadTwo(InvokedObject object)

    {

       this.object = object ;

    }

 

    public void run() {

       // TODO Auto-generated method stub

       object.generalMethod() ;

    }

 

}

 

package com.mutithreading.client;

import com.mutithreading.Object.InvokedObject;

import com.mutithreading.threads.ThreadOne;

import com.mutithreading.threads.ThreadTwo;

 

public class Client {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

 

       InvokedObject object = new InvokedObject() ;

      

       ThreadOne one = new ThreadOne(object) ;

       ThreadTwo two = new ThreadTwo(object) ;

      

       Thread threadOne = new Thread(one) ;

       Thread threadTwo = new Thread(two) ;

      

       threadOne.start() ;

       threadTwo.start() ;

 

    }

 

}

 

运行结果:

一个线程在访问一个对象的同步方法时,另一个线程可以同时访问这个对象的非同步方法。

 

 

 

情况二:

当一个线程进入一个对象的一个synchronized方法后,其它线程也访问该同步方法。

 

运行结果:

一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个同步方法。(代码略)

 

 

 

情况三:

当一个线程进入一个对象的一个synchronized方法后,其它线程同时访问该对象的另一个同步方法。

 

此处仅给出对InvokedObject类做出的修改代码:

package com.mutithreading.Object;

 

public class InvokedObject

{

   

    public synchronized void synchronizedMethod1()

    {

       System.out.println("Invoked synchronizedMethod1 !") ;

       try {

           Thread.sleep(10000) ;

       } catch (InterruptedException e) {

           e.printStackTrace();

       }

    }

   

    public synchronized void synchronizedMethod2()

    {

       System.out.println("Invoked synchronizedMethod2 !") ;

    }

 

}

 

 

运行结果:

一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个对象的另一个同步方法。

 

情况一:

当一个线程进入一个对象的一个synchronized方法后,其它线程访问该对象的非同步方法。

代码如下:

package com.mutithreading.Object;

 

public class InvokedObject

{

   

    public synchronized void synchronizedMethod()

    {

       System.out.println("Invoked synchronizedMethod !") ;

       try {

           Thread.sleep(10000) ;

       } catch (InterruptedException e) {

           e.printStackTrace();

       }

    }

   

    public void generalMethod()

    {

       System.out.println("Invoked generalMethod ...") ;

    }

 

}

 

 

package com.mutithreading.threads;

import com.mutithreading.Object.InvokedObject;

 

public class ThreadOne implements Runnable {

 

    private InvokedObject object ;

   

    public ThreadOne(InvokedObject object)

    {

       this.object = object ;

    }

   

    public void run() {

      

       object.synchronizedMethod() ;

 

    }

 

}

 

 

package com.mutithreading.threads;

import com.mutithreading.Object.InvokedObject;

 

public class ThreadTwo implements Runnable {

 

    private InvokedObject object ;

   

    public ThreadTwo(InvokedObject object)

    {

       this.object = object ;

    }

 

    public void run() {

       // TODO Auto-generated method stub

       object.generalMethod() ;

    }

 

}

 

package com.mutithreading.client;

import com.mutithreading.Object.InvokedObject;

import com.mutithreading.threads.ThreadOne;

import com.mutithreading.threads.ThreadTwo;

 

public class Client {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

 

       InvokedObject object = new InvokedObject() ;

      

       ThreadOne one = new ThreadOne(object) ;

       ThreadTwo two = new ThreadTwo(object) ;

      

       Thread threadOne = new Thread(one) ;

       Thread threadTwo = new Thread(two) ;

      

       threadOne.start() ;

       threadTwo.start() ;

 

    }

 

}

 

运行结果:

一个线程在访问一个对象的同步方法时,另一个线程可以同时访问这个对象的非同步方法。

 

 

 

情况二:

当一个线程进入一个对象的一个synchronized方法后,其它线程也访问该同步方法。

 

运行结果:

一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个同步方法。(代码略)

 

 

 

情况三:

当一个线程进入一个对象的一个synchronized方法后,其它线程同时访问该对象的另一个同步方法。

 

此处仅给出对InvokedObject类做出的修改代码:

package com.mutithreading.Object;

 

public class InvokedObject

{

   

    public synchronized void synchronizedMethod1()

    {

       System.out.println("Invoked synchronizedMethod1 !") ;

       try {

           Thread.sleep(10000) ;

       } catch (InterruptedException e) {

           e.printStackTrace();

       }

    }

   

    public synchronized void synchronizedMethod2()

    {

       System.out.println("Invoked synchronizedMethod2 !") ;

    }

 

}

 

 

运行结果:

一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个对象的另一个同步方法。

 
 
 

http://blog.csdn.net/hsuxu/article/details/8589108

相关文章
|
9天前
|
Java 开发者 C++
Java多线程同步大揭秘:synchronized与Lock的终极对决!
Java多线程同步大揭秘:synchronized与Lock的终极对决!
41 5
|
11天前
|
设计模式 安全 Java
Java并发编程实战:使用synchronized关键字实现线程安全
Java并发编程实战:使用synchronized关键字实现线程安全
26 0
|
3天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
4天前
|
Java Spring
运行@Async注解的方法的线程池
自定义@Async注解线程池
20 3
|
9天前
|
安全 Java 开发者
Java多线程同步:synchronized与Lock的“爱恨情仇”!
Java多线程同步:synchronized与Lock的“爱恨情仇”!
70 5
|
10天前
|
算法 安全 Java
三种方法教你实现多线程交替打印ABC,干货满满!
本文介绍了多线程编程中的经典问题——多线程交替打印ABC。通过三种方法实现:使用`wait()`和`notify()`、`ReentrantLock`与`Condition`、以及`Semaphore`。每种方法详细讲解了实现步骤和代码示例,帮助读者理解和掌握线程间的同步与互斥,有效解决并发问题。适合不同层次的开发者学习参考。
23 4
|
9天前
|
Java 开发者
在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选
在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选。相比 `synchronized`,Lock 提供了更灵活强大的线程同步机制,包括可中断等待、超时等待、重入锁及读写锁等高级特性,极大提升了多线程应用的性能和可靠性。通过示例对比,可以看出 Lock 接口通过 `lock()` 和 `unlock()` 明确管理锁的获取和释放,避免死锁风险,并支持公平锁选择和条件变量,使其在高并发场景下更具优势。掌握 Lock 接口将助力开发者构建更高效、可靠的多线程应用。
11 2
|
9天前
|
Java 测试技术
Java多线程同步实战:从synchronized到Lock的进化之路!
Java多线程同步实战:从synchronized到Lock的进化之路!
71 1
|
14天前
|
Java C++
【Java 并发秘籍】synchronized vs ReentrantLock:揭秘线程同步神器的对决!
【8月更文挑战第24天】本文详细对比了Java并发编程中`synchronized`关键字与`ReentrantLock`的不同之处。`synchronized`作为内置关键字,提供自动锁管理但不支持中断或公平锁;`ReentrantLock`则通过显式调用方法控制锁,具备更多高级功能如可中断、公平锁及条件变量。文章通过两个计数器类实例展示了两种机制的具体应用,帮助读者理解其差异及适用场景。掌握这两者对于提升多线程程序设计能力至关重要。
32 0
|
11天前
|
存储 监控 Java
Java多线程优化:提高线程池性能的技巧与实践
Java多线程优化:提高线程池性能的技巧与实践
38 1