尚学堂【官网】-西安Java培训|c++培训|Android培训|安卓培训|java视频教程|软件工程师|-西安雁塔尚学堂计算机学校
Java教程  尚学堂首页Java学院Java教程

尚学堂:浅谈java并发问题(一)

www.xasxt.com 发布人:java  |  来自:本站  |  发布时间:2015-05-29 10:30:22  |  点击次数:1554

       java并发,是程序员经常会遇到的问题,对于java新手来说,很多时候都束手无策。一般我们的程序是在同一进程中运行的,这里我们可以简单的认为并发编程=多线程编程。除此之外还有一种并发编程是多进程编程,这个今天先不关注。

       多线程编程是一个重要的软件基础,不管你的代码中是否存在多线程,java程序在jvm中一定是多线程运行的。多个进程或线程在同一段时间内访问同一资源会产生并发问题。

       举个例子:银行操作员为同一个帐号进行操作,账户余额为1000元,A操作员为账户存款100元,B操作员同时为账户减去50元,A先提交,B后提交,最后实际账户余额为1000-50=950元,但程序执行应该是1000+100-50=1050,这就是典型的并发问题,应该怎么解决呢?

       这时候可以用锁,java中的synchronized。具体的用法有以下4种写法:

//第一种写法
public class Test{
    public synchronized void print(){
        ....;
    }
}

       某线程执行print()方法,则该对象将加锁。其它线程将无法执行该对象的所有synchronized块。

//第二种写法
public class Test{
    public void print(){
        synchronized(this){//锁住本对象
            ...;
        }
    }
}

       同用法1, 但更能体现synchronized用法的本质。

//第三种写法
public class Test{
    private String a = "test";
    public void print(){
        synchronized(a){//锁住a对象
            ...;
        }
    }
    public synchronized void t(){
        ...; //这个同步代码块不会因为print()而锁定.
    }
}

       执行print(),会给对象a加锁,注意不是给Test的对象加锁,也就是说Test对象的其它synchronized方法不会因为print()而被锁。同步代码块执行完,则释放对a的锁。为了锁住一个对象的代码块而不影响该对象其它 synchronized块的高性能写法:

public class Test{
    private byte[] lock = new byte[0];
    public void print(){
        synchronized(lock){
            ...;
        }
    }
    public synchronized void t(){
        ...;
    }
}

//第四种写法
public class Test{
    public synchronized static void execute(){
        ...;
    }
}
效果同
public class Test{
    public static void execute(){
        synchronized(TestThread.class){
            ...;
        }
    }
}

       虽然在编写程序时,用到多线程的时候并是很多,但是一些重要的框架还是需要用的,因此,随着程序员技术的提升,对软件设计以及代码的可扩展性能等等要求,多线程是必须要掌握的。

当前文:尚学堂:浅谈java并发问题(一)
上一页:尚学堂:浅谈java并发问题(二)
下一页:java中的try...catch用法
在线报名(*为必填项)