16.6 You are given a class with synchronized method A and a normal method B. If you have two threads in one instance of a program, can they both execute A at the same time? Can they execute A and B at the same time?

当我们给一个方法加了synchronized关键字,我们确保了两个线程不能同时执行同一个对象的该方法。所以对于第一问的答案是根据情况而定,如果两个线程有对象的同一个实例,那么答案是不行,它们不能同时执行方法A,但是当它们有对象的不同实例,那么它们就可以。我们可以用锁的概念来理解,一个synchronized方法就是在该实例对象上加了锁的方法,这样就阻止了其他线程执行该实例的其他synchronized方法。

对于第二部分,由于方法B并没有synchronized关键字,所以当线程2运行方法B时不会有东西阻碍线程1运行方法A,而且不论线程1和2是否有相同的实例对象。总而言之,需要牢记的是,只有一个同步synchronized方法可以在对象中的一个实例中执行,其他线程可以执行该实例的非同步non-synchronized方法,或者他们可以执行该对象的其他实例的任何方法。

  1. public class Foo {
  2. private String name;
  3.  
  4. public Foo(String nm) {
  5. name = nm;
  6. }
  7.  
  8. public String getName() {
  9. return name;
  10. }
  11.  
  12. public void pause() {
  13. try {
  14. Thread.sleep(1000 * 3);
  15. } catch(InterruptedException e) {
  16. e.printStackTrace();
  17. }
  18. }
  19.  
  20. public synchronized void methodA (String threadName) {
  21. System.out.println("thread" + threadName + " starting; " + name + ".methodA()");
  22. pause();
  23. System.out.println("thread" + threadName + " ending: " + name + ".methodA()");
  24. }
  25.  
  26. public void methodB(String threadName) {
  27. System.out.println("thread " + threadName + " starting: " + name + ".methodB()");
  28. pause();
  29. System.out.println("thread " + threadName + " ending: " + name + ".methodB()");
  30. }
  31. }
  32.  
  33. public class MyThread extends Thread {
  34. private Foo foo;
  35. public String name;
  36. public String firstMethod;
  37. public MyThread(Foo f, String nm, String fM) {
  38. foo = f;
  39. name = nm;
  40. firstMethod = fM;
  41. }
  42.  
  43. public void run() {
  44. if (firstMethod.equals("A")) {
  45. foo.methodA(name);
  46. } else {
  47. foo.methodB(name);
  48. }
  49. }
  50. }
  51.  
  52. public class j {
  53. public static void main(String[] args) {
  54. System.out.println("Part 1 Demo with same instance.");
  55. Foo fooA = new Foo("ObjectOne");
  56. MyThread thread1a = new MyThread(fooA, "Dog", "A");
  57. MyThread thread2a = new MyThread(fooA, "Cat", "A");
  58. thread1a.start();
  59. thread2a.start();
  60. while (thread1a.isAlive() || thread2a.isAlive()) {}
  61. System.out.println("\n\n");
  62.  
  63. System.out.println("Part 1 Demo with different instance.");
  64. Foo fooB1 = new Foo("ObjectOne");
  65. Foo fooB2 = new Foo("ObejctTwo");
  66. MyThread thread1b = new MyThread(fooB1, "Dog", "A");
  67. MyThread thread2b = new MyThread(fooB1, "Cat", "A");
  68. thread1b.start();
  69. thread2b.start();
  70. while (thread1b.isAlive() || thread2b.isAlive()) {};
  71. System.out.println("\n\n");
  72.  
  73. System.out.println("Part 2 Demo.");
  74. Foo fooC = new Foo("ObjectOne");
  75. MyThread thread1c = new MyThread(fooC, "Dog", "A");
  76. MyThread thread2c = new MyThread(fooC, "Cat", "B");
  77. thread1c.start();
  78. thread2c.start();
  79. }
  80. }

CareerCup All in One 题目汇总

[CareerCup] 16.6 Synchronized Method 同步方法的更多相关文章

  1. java synchronized静态同步方法与非静态同步方法,同步语句块

    摘自:http://topmanopensource.iteye.com/blog/1738178 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁. 对代码进行同步控制我们可以选择同步方 ...

  2. Java Synchronized Method This Static Class Object 区别

    1. 必须基于对象 Synchronized Method 和 Synchronized(this) 块,除了范围小点 (方法和块),没差别都是阻塞整个对象 - 如果对象有多个 Synchronize ...

  3. [CareerCup] 16.5 Semphore 信号旗

    16.5 Suppose we have the following code:public class Foo { public Foo() { . . . } public void first( ...

  4. Java并发编程实战(使用synchronized实现同步方法)

    本文介绍java最基本的同步方式,即使用synchronized关键字来控制一个方法的并发访问,如果一个对象已用synchronized关键字声明,那么只有一个执行线程允许去访问它,其它试图访问这个对 ...

  5. [CareerCup] 16.4 A Lock Without Deadlocks 无死锁的锁

    16.4 Design a class which provides a lock only if there are no possible deadlocks. 有很多方法可以避免死锁的发生,一个 ...

  6. [CareerCup] 16.3 Dining Philosophers 哲学家聚餐问题

    16.3 In the famous dining philosophers problem, a bunch of philosophers are sitting around a circula ...

  7. [CareerCup] 16.2 Measure Time in a Context Switch 测量上下文转换的时间

    16.2 How would you measure the time spent in a context switch? 上下文转换发生在两个进程之间,比如让一个等待进程进入执行和让一个运行进程进 ...

  8. [CareerCup] 16.1 Thread and Process 线程和进程

    16.1 What's the difference between a thread and a process? 进程Process是程序执行时的一个实例.一个进程是被分配系统资源的独立单元,每个 ...

  9. Java多线程初学者指南(11):使用Synchronized块同步方法

    synchronized关键字有两种用法.第一种就是在<使用Synchronized关键字同步类方法>一文中所介绍的直接用在方法的定义中.另外一种就是synchronized块.我们不仅可 ...

随机推荐

  1. bbed的使用--查看数据文件信息 & sid信息

    1.得到文件的块大小和数据块个数 在Linux和Unix上,oracle提供了一个小工具dbfsize用于查看文件块大小 (可以参看[ID:360032.1]How to detect and fix ...

  2. OVER(PARTITION BY)函数用法

    OVER(PARTITION BY)函数介绍 开窗函数               Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返 ...

  3. WEB前端知识体系脑图

    说在开始的话: 我上大学那会,虽说主要是学Java语言,但是web前端也稍微学了一些,那时候对前端也没多在意,因为涉入的不深,可以搞一个差不多可以看的界面就可以了,其他也没过多在意. 因为稍微了解一点 ...

  4. 删除表数据drop、truncate和delete的用法

    说到删除表数据的关键字,大家记得最多的可能就是delete了 然而我们做数据库开发,读取数据库数据.对另外的两兄弟用得就比较少了 现在来介绍另外两个兄弟,都是删除表数据的,其实也是很容易理解的 老大- ...

  5. BurpSuite导出log配合SQLMAP批量扫描注入点

    sqlmap可以批量扫描包含有request的日志文件,而request日志文件可以通过burpsuite来获取, 因此通过sqlmap结合burpsuite工具,可以更加高效的对应用程序是否存在SQ ...

  6. SpringJMS解析2-JmsTemplate

    尽管消息接收可以使用消息监听器的方式替代模版方法,但是在发送的时候是无法替代的,在Spring中必须要使用JmsTemplate提供的方法来进行发送操作,可见JmsTemplate类的重要性,那么我们 ...

  7. HTML5优点

    1.标签的改变:<header>, <footer>, <dialog>, <aside>, <figure>, <section&g ...

  8. String equals()方法使用以及子串加密

    String equals()方法的实现方法: 名称 说明 String.Equals (Object) 确定此 String 实例是否与指定的对象(也必须是 String)具有相同的值. Strin ...

  9. I Hate It(线段树基础)

    Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  10. jQuery实现等比例缩放大图片

      在布局页面时,有时会遇到大图片将页面容器“撑破”的情况,尤其是加载外链图片(通常是通过采集的外站的图片).那么本文将为您讲述使用jQuery如何按比例缩放大图片,让大图片自适应页面布局. 通常我们 ...