留言与评论(共有 0 条评论) |
发布时间:2020-04-12 08:46:45
谢谢邀请
在Java中,同步的代码块一次只能由一个线程执行。此外,java支持多个线程同时执行。这可能导致两个或多个线程同时访问相同的字段或对象。
同步是使执行中的所有并发线程保持同步的过程。同步可避免由于共享内存视图不一致而导致的内存一致性错误。当方法声明为synchronized时 ; 该线程持有监视器或锁定对象为这个方法的对象。如果另一个线程正在执行synchronized方法,则您的线程将被阻塞,直到该线程释放监视器。
请注意,我们可以在类中使用关键字来定义方法或块。关键字不能与类定义中的变量或属性一起使用。
使用synchronized锁 需要注意下面几个方面
首先,了解一下synchronized。
它是java的同步锁关键字,一般有四种用法:
锁代码块
锁对象
锁方法
锁类
锁对象示例:
synchronized (a) { a= a+ 1}
锁代码块示例:
synchronized(this) { a = a + 1; }
锁方法示例:
private synchronized int add(int a){}
锁类示例:
synchronized (AClazz) { a = a+1 }
根据阿里巴巴Java开发手册,同步锁需要消耗很大的性能,所以在达到相同目的的情况下:
无锁优先于锁
锁对象优先于锁类
锁代码块优先于锁方法
java synchronized锁对象,当对象引用是null的时候,锁的是什么?它不会锁任何对象,因为当使用synchronized锁null时,它会抛出NullPointerException。
谢邀!
Java语言规范中明确指出如果锁住的对象是null,则会NullPointerException,规范内容如下:
The type of Expression must be a reference type, or a compile-time error occurs. A synchronized statement is executed by first evaluating the Expression. Then: If evaluation of the Expression completes abruptly for some reason, then the synchronized statement completes abruptly for the same reason. Otherwise, if the value of the Expression is null, a NullPointerException is thrown.
锁个空指针给你
会crash
留言与评论(共有 0 条评论) |
全站搜索