[CareerCup] 16.6 Synchronized Method 同步方法
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方法,或者他们可以执行该对象的其他实例的任何方法。
- public class Foo {
- private String name;
- public Foo(String nm) {
- name = nm;
- }
- public String getName() {
- return name;
- }
- public void pause() {
- try {
- Thread.sleep(1000 * 3);
- } catch(InterruptedException e) {
- e.printStackTrace();
- }
- }
- public synchronized void methodA (String threadName) {
- System.out.println("thread" + threadName + " starting; " + name + ".methodA()");
- pause();
- System.out.println("thread" + threadName + " ending: " + name + ".methodA()");
- }
- public void methodB(String threadName) {
- System.out.println("thread " + threadName + " starting: " + name + ".methodB()");
- pause();
- System.out.println("thread " + threadName + " ending: " + name + ".methodB()");
- }
- }
- public class MyThread extends Thread {
- private Foo foo;
- public String name;
- public String firstMethod;
- public MyThread(Foo f, String nm, String fM) {
- foo = f;
- name = nm;
- firstMethod = fM;
- }
- public void run() {
- if (firstMethod.equals("A")) {
- foo.methodA(name);
- } else {
- foo.methodB(name);
- }
- }
- }
- public class j {
- public static void main(String[] args) {
- System.out.println("Part 1 Demo with same instance.");
- Foo fooA = new Foo("ObjectOne");
- MyThread thread1a = new MyThread(fooA, "Dog", "A");
- MyThread thread2a = new MyThread(fooA, "Cat", "A");
- thread1a.start();
- thread2a.start();
- while (thread1a.isAlive() || thread2a.isAlive()) {}
- System.out.println("\n\n");
- System.out.println("Part 1 Demo with different instance.");
- Foo fooB1 = new Foo("ObjectOne");
- Foo fooB2 = new Foo("ObejctTwo");
- MyThread thread1b = new MyThread(fooB1, "Dog", "A");
- MyThread thread2b = new MyThread(fooB1, "Cat", "A");
- thread1b.start();
- thread2b.start();
- while (thread1b.isAlive() || thread2b.isAlive()) {};
- System.out.println("\n\n");
- System.out.println("Part 2 Demo.");
- Foo fooC = new Foo("ObjectOne");
- MyThread thread1c = new MyThread(fooC, "Dog", "A");
- MyThread thread2c = new MyThread(fooC, "Cat", "B");
- thread1c.start();
- thread2c.start();
- }
- }
[CareerCup] 16.6 Synchronized Method 同步方法的更多相关文章
- java synchronized静态同步方法与非静态同步方法,同步语句块
摘自:http://topmanopensource.iteye.com/blog/1738178 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁. 对代码进行同步控制我们可以选择同步方 ...
- Java Synchronized Method This Static Class Object 区别
1. 必须基于对象 Synchronized Method 和 Synchronized(this) 块,除了范围小点 (方法和块),没差别都是阻塞整个对象 - 如果对象有多个 Synchronize ...
- [CareerCup] 16.5 Semphore 信号旗
16.5 Suppose we have the following code:public class Foo { public Foo() { . . . } public void first( ...
- Java并发编程实战(使用synchronized实现同步方法)
本文介绍java最基本的同步方式,即使用synchronized关键字来控制一个方法的并发访问,如果一个对象已用synchronized关键字声明,那么只有一个执行线程允许去访问它,其它试图访问这个对 ...
- [CareerCup] 16.4 A Lock Without Deadlocks 无死锁的锁
16.4 Design a class which provides a lock only if there are no possible deadlocks. 有很多方法可以避免死锁的发生,一个 ...
- [CareerCup] 16.3 Dining Philosophers 哲学家聚餐问题
16.3 In the famous dining philosophers problem, a bunch of philosophers are sitting around a circula ...
- [CareerCup] 16.2 Measure Time in a Context Switch 测量上下文转换的时间
16.2 How would you measure the time spent in a context switch? 上下文转换发生在两个进程之间,比如让一个等待进程进入执行和让一个运行进程进 ...
- [CareerCup] 16.1 Thread and Process 线程和进程
16.1 What's the difference between a thread and a process? 进程Process是程序执行时的一个实例.一个进程是被分配系统资源的独立单元,每个 ...
- Java多线程初学者指南(11):使用Synchronized块同步方法
synchronized关键字有两种用法.第一种就是在<使用Synchronized关键字同步类方法>一文中所介绍的直接用在方法的定义中.另外一种就是synchronized块.我们不仅可 ...
随机推荐
- bbed的使用--查看数据文件信息 & sid信息
1.得到文件的块大小和数据块个数 在Linux和Unix上,oracle提供了一个小工具dbfsize用于查看文件块大小 (可以参看[ID:360032.1]How to detect and fix ...
- OVER(PARTITION BY)函数用法
OVER(PARTITION BY)函数介绍 开窗函数 Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返 ...
- WEB前端知识体系脑图
说在开始的话: 我上大学那会,虽说主要是学Java语言,但是web前端也稍微学了一些,那时候对前端也没多在意,因为涉入的不深,可以搞一个差不多可以看的界面就可以了,其他也没过多在意. 因为稍微了解一点 ...
- 删除表数据drop、truncate和delete的用法
说到删除表数据的关键字,大家记得最多的可能就是delete了 然而我们做数据库开发,读取数据库数据.对另外的两兄弟用得就比较少了 现在来介绍另外两个兄弟,都是删除表数据的,其实也是很容易理解的 老大- ...
- BurpSuite导出log配合SQLMAP批量扫描注入点
sqlmap可以批量扫描包含有request的日志文件,而request日志文件可以通过burpsuite来获取, 因此通过sqlmap结合burpsuite工具,可以更加高效的对应用程序是否存在SQ ...
- SpringJMS解析2-JmsTemplate
尽管消息接收可以使用消息监听器的方式替代模版方法,但是在发送的时候是无法替代的,在Spring中必须要使用JmsTemplate提供的方法来进行发送操作,可见JmsTemplate类的重要性,那么我们 ...
- HTML5优点
1.标签的改变:<header>, <footer>, <dialog>, <aside>, <figure>, <section&g ...
- String equals()方法使用以及子串加密
String equals()方法的实现方法: 名称 说明 String.Equals (Object) 确定此 String 实例是否与指定的对象(也必须是 String)具有相同的值. Strin ...
- I Hate It(线段树基础)
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- jQuery实现等比例缩放大图片
在布局页面时,有时会遇到大图片将页面容器“撑破”的情况,尤其是加载外链图片(通常是通过采集的外站的图片).那么本文将为您讲述使用jQuery如何按比例缩放大图片,让大图片自适应页面布局. 通常我们 ...