对象的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

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

  1. 【Java面试题】26 多线程有几种实现方法?同步有几种实现方法? 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

    问题一:多线程有几种实现方法?同步有几种实现方法? 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口   同步的实现方面有两种,分别是synchronized,wait与not ...

  2. 当一个线程进入一个对象的一个synchronized方法后, 其它线程是否可进入此对象的其它方法?

    分几种情况: 1.其他方法前是否加了synchronized关键字,如果没加,则能. 2.如果这个方法内部调用了wait,则可以进入其他synchronized方法. 3.如果其他个方法都加了sync ...

  3. Spring中获取request的几种方法,及其线程安全性分析

    前言 本文将介绍在Spring MVC开发的web系统中,获取request对象的几种方法,并讨论其线程安全性. 原创不易,如果觉得文章对你有帮助,欢迎点赞.评论.文章有疏漏之处,欢迎批评指正. 欢迎 ...

  4. [No000016E]Spring 中获取 request 的几种方法,及其线程安全性分析

    前言 本文将介绍在Spring MVC开发的web系统中,获取request对象的几种方法,并讨论其线程安全性. 原创不易,如果觉得文章对你有帮助,欢迎点赞.评论.文章有疏漏之处,欢迎批评指正. 欢迎 ...

  5. Spring中获取request的几种方法,及其线程安全性分析(山东数漫江湖)

    前言 本文将介绍在Spring MVC开发的web系统中,获取request对象的几种方法,并讨论其线程安全性. 原创不易,如果觉得文章对你有帮助,欢迎点赞.评论.文章有疏漏之处,欢迎批评指正. 欢迎 ...

  6. Spring中如何获取request的方法汇总及其线程安全性分析

    前言 本文将介绍在Spring MVC开发的web系统中,获取request对象的几种方法,并讨论其线程安全性.下面话不多说了,来一起看看详细的介绍吧. 概述 在使用Spring MVC开发Web系统 ...

  7. 线程中断:Thread类中interrupt()、interrupted()和 isInterrupted()方法详解

    首先看看官方说明: interrupt()方法 其作用是中断此线程(此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行. i ...

  8. 六种多线程方法解决UI线程堵塞

    http://blog.csdn.net/oyi319/article/details/6851371 一.六种多线程方法 .NET Framework2.0框架提供了至少4种方式实现多线程,它们是& ...

  9. 当一个线程进入某个对象的一个 synchronized 的实例方 法后,其它线程是否可进入此对象的其它方法?

    如果其他方法没有 synchronized 的话,其他线程是可以进入的. 所以要开放一个线程安全的对象时,得保证每个方法都是线程安全的.

随机推荐

  1. Windows Phone开发(42):缓动动画

    原文:Windows Phone开发(42):缓动动画 前面在讨论关键帧动画的时候,我有意把几个带缓动动画的关键帧动画忽略掉,如EasingColorKeyFrame.EasingDoubleKeyF ...

  2. Nim博弈游戏

    给定n堆石子,每次每人能从一堆石子中取若干个石子(不能不取),最后不能取石子者败 对于这个游戏,我们要判断的是,给定局势下,先手者胜还是败 设先手胜的局势为N-postion,先手败的局势为P-pos ...

  3. 【j2ee spring】27、巴巴荆楚网-整合hibernate4+spring4(2)

    巴巴荆楚网-整合hibernate4+spring4(2) 1.图文项目 2.首先我们引入对应的jar包 这里用的是oracle 11g,所以我们使用的数据库连接jar包是ojdbc6, 的区别就是支 ...

  4. HTML5管理与实际历史的分析(history物)

    HTML5新进入历史的管理,更新history对象允许国家的经营历史更方便. 在现代Web应用.用户"前进"和"退却"button切换历史页面.这使得新的页码不 ...

  5. silverlight 和winform的结合使用

    silverlight 和winform的结合使用比较简单,将silverlight承载在页面上,页面运行在winform上的webbrowser中即可. 这样的情况下,我没找到页面中silverli ...

  6. 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)

    原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...

  7. shell 脚本运算符

    1.数值 格式: test "num1" opr "num2" [ "num1" opr "num2" ] opr 取值 ...

  8. Leetcode - Jump Game Two

    和Jump Game几乎相同的想法,他们是DP.关键是使用数组maxNumbers[k]储存的地方k步骤的话.序列号的最远范围,注阵maxNumbers[]它递增. class Solution { ...

  9. 最小二乘法拟合非线性函数及其Matlab/Excel 实现(转)

    1.最小二乘原理 Matlab直接实现最小二乘法的示例: close x = 1:1:100; a = -1.5; b = -10; y = a*log(x)+b; yrand = y + 0.5*r ...

  10. LatinIME输入法分析

    输入法的设置在res/xml/method.xml的<input-method>标签中,主要设置两个属性: android:settingsActivity,输入法的设置程序入口. and ...