JAVA中synchronized的疑问? -问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

JAVA中synchronized的疑问?

2016-02-29 16:44:15 1943 1

对于线程并发的数据同步,JAVA提供了synchronized供选择。加了synchronized方法或者代码块儿,如果一个线程进入synchronized,那么这个线程获得对应对象的锁,其他线程只能等待获取这个对象的锁。
对于线程中锁,最重要的两点是确定锁的对象是谁,谁持有了锁。
我相信上面的理解应该没有错吧,那么对于下面的代码有一些疑问,伪代码:

public class TestThread implements Runnable {
    public static Object o1 = new Long(-1);

    public static Object o2 = new Long(-2);

    @Override
    public void run() {
        synchronized (o1) {
            System.out.println("I am o1:" + Thread.currentThread().getName());
        }

        synchronized (o2) {
            System.out.println("I am o2:" + Thread.currentThread().getName());
        }
    }
}

static ExecutorService executorService = Executors.newFixedThreadPool(3);

public static void main(String[] args) {
    executorService.submit(new TestThread());
    executorService.submit(new TestThread());
    executorService.submit(new TestThread());
    executorService.shutdown();
}

现在创建了三个线程,每个线程执行到synchronized后,其他线程都要等待。我的问题是:

  1. 创建了三个线程,每个线程中o1、o2都是不同的对象。根据我的理解,线程获取到的都是不同对象的锁,因此线程执行到synchronized代码块儿,其他程序执行到同样地方都拿到的是不同对象的锁,理应不会发生等待的。是我的那里理解的有问题吗?
取消 提交回答
全部回答(1)
  • 蛮大人123
    2019-07-17 18:50:33

    是阻塞,以为是static修饰的变量,去掉static就是并行允许

    public class TestThread implements Runnable {
    public static Object o1 = new Long(-1);
    public static Integer num = new Integer(0);
    static ExecutorService executorService = Executors.newFixedThreadPool(3);
    public void run() {
        synchronized (o1) {
            num++ ;
            System.out.println("I am :" + num+"======"+Thread.currentThread().getName());
            
        }
    
    }
    public static void main(String[] args) {
        
        for(int i = 0 ; i < 10 ; i++){
            
            executorService.submit(new TestThread());
        }
        executorService.shutdown();
    }
    }

    运行结果:
    I am :1======pool-1-thread-1
    I am :2======pool-1-thread-1
    I am :3======pool-1-thread-3
    I am :4======pool-1-thread-3
    I am :5======pool-1-thread-2
    I am :6======pool-1-thread-3
    I am :7======pool-1-thread-1
    I am :8======pool-1-thread-3
    I am :9======pool-1-thread-1
    I am :10======pool-1-thread-2

    0 0
相关问答

42

回答

[@徐雷frank][¥20]什么是JAVA的平台无关性

大河人家 2018-10-29 23:55:20 147402浏览量 回答数 42

170

回答

惊喜翻倍:免费ECS+免费环境配置~!(ECS免费体验6个月活动3月31日结束)

豆妹 2014-10-29 17:52:21 233745浏览量 回答数 170

8

回答

OceanBase 使用动画(持续更新)

mq4096 2019-02-20 17:16:36 341325浏览量 回答数 8

13

回答

[@饭娱咖啡][¥20]我想知道 Java 关于引用那一块的知识

心意乱 2018-10-31 18:44:12 143634浏览量 回答数 13

119

回答

OSS存储服务-客户端工具

newegg11 2012-05-17 15:37:18 302546浏览量 回答数 119

22

回答

爬虫数据管理【问答合集】

我是管理员 2018-08-10 16:37:41 148937浏览量 回答数 22

24

回答

阿里云开放端口权限

xcxx 2016-07-20 15:03:33 660277浏览量 回答数 24

31

回答

[@倚贤][¥20]刚学完html/css/js的新手学习servlet、jsp需要注意哪些问题?

弗洛伊德6 2018-10-27 21:52:43 148002浏览量 回答数 31

43

回答

【精品问答集锦】Python热门问题

小六码奴 2019-05-30 15:27:34 144296浏览量 回答数 43

10

回答

[@墨玖tao][¥20]为什么流式处理框架都是 java 写成的,JVM 是不是在流和批存在着特殊优势。还有分布式资源调度,感觉Mesos 的成长速度跟不上 Yarn。这是为什么?

管理贝贝 2018-10-23 13:18:03 137739浏览量 回答数 10
+关注
蛮大人123
我说我不帅他们就打我,还说我虚伪
0
文章
7733
问答
问答排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载