12
回答
synchronized 如果来修饰两个方法,这两个方法会同步吗?比如..
class Test{
 synchronized static void sayHello3(){
 
 }
 
 sychronized void getX(){}
}

这两个方法能同步吗? 求解!

举报
共有12个答案 最后回答: 3年前
一个是静态方法一个是成员方法,都采用sychronized 关键字,这个是不会互斥的
因为他们用的锁不一样,静态方法的锁是Test.class,而普通方法的锁是this
如果两个方法都是静态的,或都是成员方法,就可以了
package org.qxh.thread;

/**
 * @author: qinxiaohui01
 */
public class TranditionalThreadSync {
    public static void main(String[] args) {

        final Outputer outputer = new Outputer();

        new Thread(new Runnable() {
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    outputer.output("1111111111111111111111");
                }
            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    outputer.output2("222222222222222222222222");
                }
            }
        }).start();
    }
}

class Outputer {
    public void output(String name) {
        int len = name.length();
        for (int i = 0; i < len; i++) {
            System.out.print(name.charAt(i));
        }
        System.out.println();
    }

    public void output2(String name) {
        int len = name.length();
        for (int i = 0; i < len; i++) {
            System.out.print(name.charAt(i));
        }
        System.out.println();
    }
}

上面的代码运行输出:

1111111111111111111111

222222222222222222222222

2222221111111111111111111111

222222222222222222

222222222222222222222222

1111111111111111111111

如果你的需求是CPU在执行output1的时候不能切换去执行output2,那么这两个方法就存在同步问题,如上面的输出。

只要在两个方法上加上synchronized 就可以,不过尽量采用synchronized 代码块,而不是放在方法签名上,这样就可以保证synchronized 代码块尽量的小,仅把需要互斥的代码放进去,因为同步会拉慢效率

这2个方法没看出有什么联系。。各自跑各自的,各自被多线程调用时各自是同步的2个独立的队列,2个方法貌似没联系吧。。貌似排的是2行队哦。。。

引用来自“sxgkwei”的答案

这2个方法没看出有什么联系。。各自跑各自的,各自被多线程调用时各自是同步的2个独立的队列,2个方法貌似没联系吧。。貌似排的是2行队哦。。。

CPU在两个线程之间切换,如果两个方法的职责是:

1:把A账号的钱+100

2:把A账号的钱-200

问题就大了

--- 共有 1 条评论 ---
一枝独秀郑以上例子是两个对象啊,锁不是在同一个对象上,貌似也没用吧 5年前 回复

引用来自“UlricQin”的答案

引用来自“sxgkwei”的答案

这2个方法没看出有什么联系。。各自跑各自的,各自被多线程调用时各自是同步的2个独立的队列,2个方法貌似没联系吧。。貌似排的是2行队哦。。。

CPU在两个线程之间切换,如果两个方法的职责是:

1:把A账号的钱+100

2:把A账号的钱-200

问题就大了

准确的说不是两个方法的职责,应该是两个线程的职责~~~ 你的说法容易误导~~  个人见解~~  不对请包涵~~~~

引用来自“sxgkwei”的答案

这2个方法没看出有什么联系。。各自跑各自的,各自被多线程调用时各自是同步的2个独立的队列,2个方法貌似没联系吧。。貌似排的是2行队哦。。。
试试在两个线程里调用同一个方法,一个加同步,一个不加同步~~~~

第一个人说的应该就对了吧

一个是静态方法一个是成员方法,都采用sychronized 关键字,这个是不会互斥的 
因为他们用的锁不一样,静态方法的锁是Test.class,而普通方法的锁是this 
如果两个方法都是静态的,或都是成员方法,就可以了

顶部