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

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

时间: 2024-10-29 20:02:03

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

进度条 线程中断-进度条执行一次后,线程没有中断,第二次点击鼠标事件时不更新

问题描述 进度条执行一次后,线程没有中断,第二次点击鼠标事件时不更新 我是设定boolean来中断线程,执行一次进度条后二次点击鼠标事件时不再更新且弹出的搜索条窗口不消失,导致界面不能进行任何操作,这是线程没中断引起的吗?我是在一个主main函数中执行的流程 JProgressBar comp = new JProgressBar(); //进度条 int value = 0; private boolean bg001=true; JDialog dialog = new JDialog((F

java线程池当其中一个线程算出结果,终止全部线程

问题描述 java线程池当其中一个线程算出结果,终止全部线程 业务逻辑: 一个大型社区,每一秒有上千人在提交留言,提交的留言将经过,上万条的正则表达式的过滤,没有匹配任何规则的,才保存到系统,否则提示用户,您录入的内容不合法. 我是这样想的,把这上万条正则表达式,拆分成2000条一组,开一个5个线程的线程池,每个线程将负责其中2000个规则的匹配. 每条留言提交时,将由这5个线程,去判断是否有匹配的规则,如果其中一个线程匹配到了规则,将结束其他4个线程的任务,返回给用户结果. 请问这种要怎么实现

ios-iOS:请问一个线程涉及2个类,如何向该线程performSelecto?

问题描述 iOS:请问一个线程涉及2个类,如何向该线程performSelecto? 我有一个线程,这线程首先是在a类中创建,并调用a类的a1方法,而a1方法又调用了b类的b1方法. 我在c类中,想向该线程发通知,希望其调用b类的b2方法, 我的代码: [self performSelector:@selector(b2) onThread:m_thread withObject:nil waitUnitilDone:NO]; 提示:unrecognized selector to instan

java-每上传一个文件,就开启一个线程,现在调用其他方法改变了该文件的某个属性,然后该线程死亡,该怎么实现?

问题描述 每上传一个文件,就开启一个线程,现在调用其他方法改变了该文件的某个属性,然后该线程死亡,该怎么实现? 关于线程了解的不多,吸纳成池,线程监控都不了解,该怎么做? 解决方案 可以学下juc包 解决方案二: 线程池, 利用资源

java-在android中把数据从一个线程发送到另一个线程

问题描述 在android中把数据从一个线程发送到另一个线程 我在Android UI线程执行一些程序,有一个很耗时的程序,所以我把它放在另一个线程中. 1.在这个子线程运行后,UI线程会开始执行某个程序 2.这个程序将会在子线程中创建一些数据 这是我的解决方案: Car car; public void onResume(){ super.onResume(); Thread t = new Thread(){ car = new Car(); car.takePetrol; //take c

求各位大神看下这个json问题,为什么只打印了list集合其中一个对象的一个属性

问题描述 求各位大神看下这个json问题,为什么只打印了list集合其中一个对象的一个属性 解决方案 解决方案二: 是不是有父类和子类,属性在不同类中 解决方案三: 看着好像没什么错,建议逐个打印一下集合的长度,还有这个menu如果是自定义的是否有getter setter方法

android-是不是任意一个安卓程序都有一个主线程

问题描述 是不是任意一个安卓程序都有一个主线程 是不是任意一个安卓程序都有一个主线程 looper对象有什么用 如果有,这个默认的主线程是什么 解决方案 是的 mainThread 好像是 looper对象 可以百度一下 也可以参看官方文档 解决方案二: 主线程也就是UI线程,安卓程序面向用户,少不了UI界面,也少不了UI线程.Looper是一种循环机制,它维护了一个消息队列,配合Handler可以完成子线程和UI线程的通信. 解决方案三: 软件运行后,就会启动looper死循环,这里面从消息队

技术-js的api接口是一个对象还是一个方法?

问题描述 js的api接口是一个对象还是一个方法? 关于js的封装有点弄不清楚了,之前自己一直使用的是自己封装的函数,直接调用 但是学完js的面对对象的相关知识之后,有点迷糊了.我现在要添加js的api那到底是什么东西 解决方案 js中自己封装方法主要注意phototype以及注意function别当做函数,要当做类,类里面可以定义属性. 比如http://www.cnblogs.com/yjf512/archive/2011/06/03/2071914.html 解决方案二: Function

线程池就好像一个池子,可以容纳各种液体

线程池就好像一个池子,可以容纳各种液体.     在<windows核心编程>中提及了win2000的新的线程池概念,以及一个新函数,很好用,但vc6.0不支持该函数(MSDN上有),可以直接调用库里的函数,看了该函数,应该对线程池有很好的了解.我曾作了个测试:     typedef   VOID   (WINAPI   *WAITORTIMERCALLBACK)(PVOID,BOOLEAN);         typedef   BOOL   (FAR   PASCAL   *   FUN