重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

Java并发编程相关概念及注意事项是什么

Java并发编程相关概念及注意事项是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

为企业提供成都做网站、成都网站设计、网站优化、营销型网站、竞价托管、品牌运营等营销获客服务。成都创新互联拥有网络营销运营团队,以丰富的互联网营销经验助力企业精准获客,真正落地解决中小企业营销获客难题,做到“让获客更简单”。自创立至今,成功用技术实力解决了企业“网站建设、网络品牌塑造、网络营销”三大难题,同时降低了营销成本,提高了有效客户转化率,获得了众多企业客户的高度认可!

相应的概念在Java中的具体表现形式,以及使用中要注意的一些问题。

在Java的并发编程中,synchronized这个词在初期一定会被大量的使用,除非开发者熟悉J.U.C包中的相关工具类进行替换。
这里synchronized也被称为隐式锁、内置锁或管程锁,这三个都是指同一个,看到的时候不必惊讶又出新概念了。这里的锁似乎是看不到的,我们开发者只是通过关键词进行了使用,而不用关心锁的获取、释放等细节。
而实质上,隐式锁,是通过在JVM指令层面,增加monitor enter 和exit相关的指令来实现。

例如下面的几行代码:

Object o = new Object();

public void test() {

synchronized(o){

System.out.println(o);

}

}

转换成的jvm指令如下,注意monitor指令

J.U.C中的重入锁、读写锁等,相比较synchronized,会需要开发者进行显式锁的获取,释放等操作,而且两者的实现形式也不同。根据使用场景,如果需要更细粒度的控制锁,可以使用J.U.C的实现。

Java并发编程中,另一个会经常会用到且容易被用错的,就数volatile啦。
我们一般使用volatile进行一些重要标识的设置及判断,例如这样

public static volatile boolean shutDown = false;

这种情况下,当其他线程在修改标识后,对于后面执行的线程,能够保证可见性。

而对于这样类型的声明,仅仅用volatile就不能满足:

public static volatile int count = 0;

如果此处,我们把count用做计数器,对于每个线程的请求,进行count++。这种时候,结果并不会符合预期,除非我们又显式的增加了锁。

这是因为整个count++,并不是一个整体,虽然其形式上看着像是不可分割的。但其实际上是由取值,加1,赋值这几步构成。多线程执行时,容易造成错乱,最终结果不符合预期。

volatile也是实现不了的安全的count++的,毕竟它的作用是抑制CPU进行指令重排序,对于写和读都是实时获取最新结果,不受JMM的影响。为了实现安全的计数或递增,是需要锁的介入,来保证整个count++的操作是互斥的,在整个临界区内,一个线程对count的操作不受其它线程的影响。

此外,Java并发编程中,在使用synchronized进行锁定时,需要注意的一个问题是:

在自己持有锁之后,才能进行锁的waitnotify

否则你会遇到这个异常:

Exception in thread "main" java.lang.IllegalMonitorStateException

就像一个人高喊着要把他的面包给你,但是他手里只有空气…,而你把口水吐到了他有脸上   :)

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。


文章名称:Java并发编程相关概念及注意事项是什么
路径分享:http://cqcxhl.cn/article/giijjs.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP