[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 All in One 题目汇总

时间: 2024-08-30 00:22:24

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

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

本文介绍java最基本的同步方式,即使用synchronized关键字来控制一个方法的并发访问,如果一个对象已用synchronized关键字声明,那么只有一个执行线程允许去访问它,其它试图访问这个对象的线程将被挂起,直到第一个线程访问完毕. 下面通过一个小例子来学习这个概念,公司向银行存钱,取钱场景. 1:创建Account的账号类,它是银行账户的模型,只有一个双精度浮点型属性,balance. 2:实现balance的get set 方法. 3:实现AddAmount()方法,将传入的数量加

java多线程编程之使用Synchronized块同步方法

synchronized块来同步一个对象变量,也可以使用synchronized块来同步类中的静态方法和非静态方法,下面使用Synchronized块同步方法 synchronized关键字有两种用法.第一种就是在<使用Synchronized关键字同步类方法>一文中所介绍的直接用在方法的定义中. 另外一种就是synchronized块.我们不仅可以通过synchronized块来同步一个对象变量.也可以使用synchronized块来同步 类中的静态方法和非静态方法.synchronized

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

摘自:http://topmanopensource.iteye.com/blog/1738178 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁. 对代码进行同步控制我们可以选择同步方法,也可以选择同步块,这两种方式各有优缺点,至于具体选择什么方式,就见仁见智了,同步块不仅可以更加精确的控制对象锁,也就是控制锁的作用域,何谓锁的作用域?锁的作用域就是从锁被获取到其被释放的时间.而且可以选择要获取哪个对象的对象锁.但是如果在使用同步块机制时,如果使用过多的锁也会容易引起死锁问题,同

java 多线程 synchronized块 同步方法

synchronized关键字又称同步锁 当方法执行完后,会自动释放锁,只有一个线程能进入此方法 看看以下的各种例子对synchronized的详细解释 1.是否加synchronized关键字的不同 1 public class ThreadTest { 2 3 public static void main(String[] args) { 4 Example example = new Example(); 5 6 Thread t1 = new Thread1(example); 7 T

[CareerCup] 16.5 Semphore 信号旗

16.5 Suppose we have the following code:public class Foo { public Foo() { . . . } public void first() { ... } public void second() { ... } public void thirdQ { ... }}The same instance of Foo will be passed to three different threads. ThreadA will cal

线程同步基础之使用synchronized实现同步方法

Java的最基本的同步方式,即使用synchronized关键字来控制一个方法的并发访问. 每一个用synchronized关键字声明的方法都是临界区.在Java中,同一个对象的临界区,在同一时间只有一个允许被访问. 静态方法则有不同的行为.用synchronized关键字声明的静态方法,同时只能够被一个执行线程访问,但是其他线程可以访问这个对象的非静态的synchronized方法.必须非常谨慎这一点,因为两个线程可以同时访问一个对象的两个不同的synchronized方法,即其中一个是静态s

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

16.1 What's the difference between a thread and a process? 进程Process是程序执行时的一个实例.一个进程是被分配系统资源的独立单元,每个进程在独立的地址空间上执行,如果需要使用其他进程的资源,需要使用进程间通讯,包括管道Pipes,文件Files,套接字Sockets,或者其他形式. 线程Thread存在于进程之中并分享进程的资源(包括堆空间).同一个进程中的多个线程分享同一个堆地址.这是和进程区别很大的地方,进程之间不能直接访问内

synchronized:线程同步方法使用总结

synchronized: 1.多线程执行同一对象的synchronized函数,线程同步正确: 实例代码如下: public class Test1 implements Runnable{ //定义同一对象 static Test2 action; public static void main(String[] args) { // TODO Auto-generated method stub Class cls; try { cls = Class.forName("Test2&quo

wait() ,notify() ,notifyAll(),synchronized 和同步方法锁,对象锁的联系,关系,区别;

一直不明白一个问题,因为在书上关于生产者和消费者的例子里看到一段这样的代码,估计很多人都和我一样迷惑 1 public synchronized void set(String name, String content) { 2 if (!flag) { 3 try { 4 super.wait(); 5 } catch (InterruptedException e) { 6 e.printStackTrace(); 7 } 8 this.setNme(name); 9 ....... 10