对象的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. [WPF]Binding的Converter和Validator

    不拘一格用数据的Converter 上篇文已经说明,Binding就是数据源与目标之间的“关联”.大多数情况下,数据从Source到Target以及从Target返回Source都是“直来直去”的,但 ...

  2. POJ2676 Sudoku [数独]

    好题,也非常有用,犯了几个错误 1.在枚举赋值的时候,思维有个错误:当当前的赋值不能填完这个数独,应该是继续下一个循环,而不是return false 终止枚举 2.Generic Programin ...

  3. 协同编辑多人word一个小技巧文件

    协同编辑多人word窍门 近期在工作中编写标书时因为不同内容分给了各个部门去制作.可是在汇总后遇到再次改动的问题.对方把改动后的部分文档发给我粘贴到标书中后,所有的格式所有都乱了.又一次整理格式.标题 ...

  4. sql server 远程

    资讯 |  安全 |  论坛 |  下载 |  读书 |  程序开发 |  数据库 |  系统 |  网络 |  电子书 |  站长学院 |  源码 |  QQ |  专栏 |  考试 |  手册 | ...

  5. 重新想象 Windows 8 Store Apps (16) - 控件基础: 依赖属性, 附加属性, 控件的继承关系, 路由事件和命中测试

    原文:重新想象 Windows 8 Store Apps (16) - 控件基础: 依赖属性, 附加属性, 控件的继承关系, 路由事件和命中测试 [源码下载] 重新想象 Windows 8 Store ...

  6. Android Volley 之自定义Request

    转载标明出处:http://blog.csdn.net/lmj623565791/article/details/24589837 今天群里一哥们需要自定义Volley的Request的例子,于是产生 ...

  7. 【原创翻译】认识MVC设计模式:web应用开发的基础(实际编码篇)

    原文地址:http://www.larryullman.com/2009/10/15/understanding-mvc-part-3/ 全系列INDEX [原创翻译]认识MVC设计模式:web应用开 ...

  8. UVA 10163 Storage Keepers(两次DP)

    UVA 10163 Storage Keepers(两次DP) http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Ite ...

  9. 实现能够直接粘QQ贴截图的bug管理功能

    对于一个功能强大的协作平台来说,todo管理和bug管理是不可缺少的功能.Todo和bug往往不是通过一些简单的文字就能实现的,有时候须要配以图片的说名,之前用过的项目管理平台都是以附件的形式上传图片 ...

  10. Android菜鸟的成长笔记(17)—— 再看Android中的Unbounded Service

    原文:Android菜鸟的成长笔记(17)-- 再看Android中的Unbounded Service 前面已经写过关于startService(Unbounded Service)的一篇文章:&l ...