ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 同步表达式中的方法引用

2019-08-24 19:01:01  阅读:183  来源: 互联网

标签:method-reference java java-8


对不起伙计们,但我无法理解,同步块内的sync()方法是同步的:

public class TestLambda {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                try {
                    sync();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }

    static void sync() throws InterruptedException {
        synchronized ((Runnable)TestLambda::new) {
            System.out.println("inside");
            Thread.sleep(1000L);
        }
    }
}

如果在方法引用对象上,为什么我不能只写:
synchronized(TestLambda :: new)? (这将是编译时错误).

有任何想法吗?

UPD:以防万一:它真的是同步的

UPD-2:对于那些怀疑的人,简单的例子:

C:\sandbox\research\learn8\src>"C:\Program Files\Java\jdk1.8.0_31\bin\"javac TestLambda.java
TestLambda.java:27: error: method reference not expected here
    public class Test { { synchronized (Test::new) { System.out.println("sync"); } } }
                                        ^
1 error

解决方法:

让我们看看以下2个作业:

Supplier<TestLambda> supp = TestLambda::new;
Runnable runnable = TestLambda::new;

他们两个编译得很好.基本上因为lambda或方法引用可以与多个功能接口兼容.这意味着,仅仅编写TestLambda :: new并不能告诉我们创建的对象的确切运行时类型.基于目标类型确定实例化哪个接口.并且该目标类型应始终是一个功能接口,在下面的语句中不是这种情况:

synchronized(TestLambda::new) {
}

因此,编译器不允许它,因为运行时将无法决定实例化哪个功能接口.您可以通过将方法引用强制转换为Runnable来提供该信息.所以,在下面的声明中:

synchronized((Runnable) TestLambda::new) {
}

运行时将实例化实现Runnable接口的类的对象.从某种意义上说,铸件给出了方法参考的具体性.

为了给出一个模糊的想法,这可能有点像这样翻译:

class RuntimeClass implements Runnable {
    public void run() {
        TestLambda testLambda = new TestLambda();
    }
}

synchronized(new RuntimeClass()) {
}

P.S:RuntimeClass的实际实例将是单例(因为我们正在使用无状态方法表达式) – 我原来的错误语句

P.P.S:正如@Stuart的评论所指出的那样,无法保证对于lambda或方法引用,是否会创建新实例或返回相同的实例.所以,你不应该同步它们.

标签:method-reference,java,java-8
来源: https://codeday.me/bug/20190824/1710927.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有