A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周洋 黑马帝   /  2012-4-3 17:31  /  1677 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

假设我现在写一个类,里面有两个方法,我要调用几个线程来执行他,但是我需要一个同步锁,如果方法a是静态方法,b是普通方法,用synchronized锁住这两个线程,是不是锁住a的时候b依然会被调用?这样是不是还是不安全?

3 个回复

倒序浏览
这样肯定是不行的。如下例:
public class Test {
        public static void main(String[] a) {
                new Thread(new Runnable() {

                        @Override
                        public void run() {
                                R.a();

                        }
                }).start();

                new Thread(new Runnable() {

                        @Override
                        public void run() {
                                new R().b();

                        }
                }).start();
        }
}

class R {
        static synchronized void a() {
                System.out.println("f1    1");
                try {
                        Thread.sleep(100);
                } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                System.out.println("f1    2");
        }

        synchronized void b() {
                System.out.println("f2    1");
                try {
                        Thread.sleep(100);
                } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                System.out.println("f2    2");
        }
}

输出结果是:

f1    1
f2    1
f1    2
f2    2

在非静态方法上加同步锁,锁定的是this,即创建的对象。
在静态方法上加同步锁,锁定的是类的字节码。
回复 使用道具 举报
用synchronized锁住这两个方法是不安全的,因为他们不是同一个锁,普通方法用的是this,而静态方法用的是字节码文件对象,可以用同步代码块锁住方普通方法中的关键代码,如下:
synchronized(类名.class)
{
//关键代码
}
这样他们用的就是同一个锁了。
回复 使用道具 举报
线程安不安全在于你的synchronized中的锁是否相同,锁(即synchronized中的对象)相同则安全
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马