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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马华 中级黑马   /  2013-5-3 11:31  /  1942 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马华 于 2013-5-3 22:49 编辑

多个线程不管是同步代码块还是同步函数只要是同一个锁就是同步的吗?

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

8 个回复

倒序浏览
是的,虽然同步代码块中的锁是定义的一个对象,同步函数的锁一般是this。如果两个同时出现的话,需将同步函数静态化,这时同步代码块和同步函数的公共锁是类名.class。这样就可以实现同步代码块和同步函数同时存在,并能解决线程安全问题。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
  在jdk1.5之后sun公司又重新弄了一个借口  对之前的锁什么的的一些bug进行了改变,  具体你可以去查一下API 中的java.util.concurrent.locks这个东西  好多东西觉得挺方便的  能解决不少问题
回复 使用道具 举报
同步的两个条件:
1,必须要有两个或者两个以上的线程。
2,必须是多个线程使用同一个锁。
同步代码块使用的锁要和同步函数使用的锁是同一个的时候才称为同步。同步函数使用的锁是本类对象,也就是this,那么同步代码块也要使用this锁
如果是静态同步函数,则就需要使用字节码对象这个锁了。提示:字节码对象这个锁不一定非要是本类的字节码对象,其它的也是可以的。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
个人理解的同步的前提:
1、存在两个或两个以上线程;

2、操作相同的多线程代码,也就是run()方法中的内容。

3、多个线程使用相同的锁,还要保证任意时刻至少有一个线程运行,防止死锁

不管是同步代码块还是同步函数要实现同步就得满足这3点。
回复 使用道具 举报
首先,需要说明一点,也是最重要的一点,无论是同步方法 还是 同步块 都是只针对同一个对象的多线程而言的,只有同一个对象产生的多线程,才会考虑到 同步方法 或者是 同步块,如果定义多个实例的同步,可以考虑使用mutex,创建类似于c++整个服务全局锁,或者创建一个全局单例类,在其内定义全局锁。比如以下的代码片段定义线程同步无任何意义:
public class Test1 implements Runnable
{
    public void run()
     {
           synchronized(this)
          {
                try
               {
                     System.out.println(System.currentTimeMillis());
                     Thread.sleep(2000);
                      System.out.println(System.currentTimeMillis());
                }
                catch (InterruptedException e)
               {
                    e.printStackTrace();
               }
        }
}

    public static void main(String[] args) {
        for(int i=0;i<10;i++) {
            new Thread(new Test1()).start(); // 关键,如果将 new Test1拿到外面,那么同步方法才有意义,如下:

    //public static void main(String[] args) {
     //    Test1 test=new Test1();
     //    for(int i=0;i<10;i++) {
     //        new Thread(test).start();
        }
    }
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
吴建昆 发表于 2013-5-3 12:12
个人理解的同步的前提:
1、存在两个或两个以上线程;

不一定非要是操作相同的代码吧!如:对同一个资源,一个线程存一个取,两个的动作是不一样的呀。
回复 使用道具 举报
对象如同锁,持有锁的线程可以在同步中执行。没有持有锁的线程,即使获取CPU的执行权也进不去,因为没有锁

同步的前提:
1、必须要有两个或者两个以上的线程
2、必须多个线程使用同一个锁
3、必须保证同步中只有一个线程在运行
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马