专栏名称: 程序员大咖
为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等。并不定期奉送各种福利。
目录
相关文章推荐
程序员的那些事  ·  “令人作呕!” 马斯克刚离职没几天就开喷了 ·  2 天前  
阿里技术  ·  Cursor入门:MCP开发调用和项目实战 ·  2 天前  
51好读  ›  专栏  ›  程序员大咖

干货分享!Java 多线程编程(锁优化)

程序员大咖  · 公众号  · 程序员  · 2018-03-30 10:24

正文

请到「今天看啥」查看全文



并发环境下进行编程时,需要使用锁机制来同步多线程间的操作,保证共享资源的互斥访问。加锁会带来性能上的损坏,似乎是众所周知的事情。然而,加锁本身不会带来多少的性能消耗,性能主要是在线程的获取锁的过程。如果只有一个线程竞争锁,此时并不存在多线程竞争的情况,那么JVM会进行优化,那么这时加锁带来的性能消耗基本可以忽略。因此,规范加锁的操作,优化锁的使用方法,避免不必要的线程竞争,不仅可以提高程序性能,也能避免不规范加锁可能造成线程死锁问题,提高程序健壮性。下面阐述几种锁优化的思路。


一、尽量不要锁住方法


在普通成员函数上加锁时,线程获得的是该方法所在对象的对象锁 。此时整个对象都会被锁住。这也意味着,如果这个对象提供的多个同步方法是针对不同业务的,那么由于整个对象被锁住,一个业务业务在处理时,其他不相关的业务线程也必须wait。下面的例子展示了这种情况:


LockMethod类包含两个同步方法,分别在两种业务处理中被调用:



public class LockMethod   {

public synchronized void busiA() {

for (int i = 0; i < 10000; i++) {

System.out.println(Thread.currentThread().getName() + "deal with bussiness A:"+i);

}

}

public synchronized void busiB() {

for (int i = 0; i < 10000; i++) {

System.out.println(Thread.currentThread().getName() + "deal with bussiness B:"+i);

}

}

}


BUSSA是线程类,用来处理A业务,调用的是LockMethod的busiA()方法:


public class BUSSA extends Thread {

LockMethod lockMethod;

void deal(LockMethod lockMethod){

this.lockMethod = lockMethod;

}


@Override

public void run() {

super.run();

lockMethod.busiA();

}







请到「今天看啥」查看全文