美文网首页
2.1.3多个对象多个锁

2.1.3多个对象多个锁

作者: 农家男孩 | 来源:发表于2017-07-02 21:43 被阅读0次
/**
 * @author wuyoushan
 * @date 2017/4/4.
 */
public class HasSelfPrivateNum {

    private int num=0;

    synchronized public void addI(String username){
        try {
            if (username.equals("a")) {
                num = 100;
                System.out.println("a set over!");
                Thread.sleep(200);
            }else{
                num=200;
                System.out.println("b set over!");
            }
            System.out.println(username+" num="+num);
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }
}

/**
 * @author wuyoushan
 * @date 2017/4/4.
 */
public class ThreadA extends Thread{

    private HasSelfPrivateNum numRef;

    public ThreadA(HasSelfPrivateNum numRef){
        super();
        this.numRef=numRef;
    }

    @Override
    public void run() {
        super.run();
        numRef.addI("a");
    }
}

/**
 * @author wuyoushan
 * @date 2017/4/4.
 */
public class ThreadB extends Thread{

    private HasSelfPrivateNum numRef;

    public ThreadB(HasSelfPrivateNum numRef){
        super();
        this.numRef=numRef;
    }

    @Override
    public void run() {
        super.run();
        numRef.addI("b");
    }
}

/**
 * @author wuyoushan
 * @date 2017/3/20.
 */
public class Run {
    public static void main(String[] args){
       HasSelfPrivateNum numRef1=new HasSelfPrivateNum();
       HasSelfPrivateNum numRef2=new HasSelfPrivateNum();
        ThreadA threadA=new ThreadA(numRef1);
        threadA.start();

        ThreadB threadB=new ThreadB(numRef2);
        threadB.start();
    }
}

程序的运行结果如下:

a set over!
b set over!
b num=200
a num=100

上面的示例是两个线程分别访问同一个类的两个不同实例的相同名称的同步方法,效果却是以异步的方式运行的。本示例由于创建了2个业务对象,在系统中产生出2个锁,所以运行结果是异步的,打印的效果就是先打印b,然后打印a。

从上面程序运行结果来看,虽然在HasSelfPrivateNum.java中使用了synchronized关键字,但打印的顺序却不是同步的,是交叉的。为什么是这样的结果呢?

关键字synchronized取得的锁都是对象锁,而不是把一段代码或方法(函数)当作锁,所以在上面的示例中,哪个线程先执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁Lock,那么其他线程只能呈等待状态,前提是多个线程访问的是同一个对象。

摘选自 java多线程核心编程技术-2.1.3

相关文章

  • 2.1.3多个对象多个锁

    程序的运行结果如下: 上面的示例是两个线程分别访问同一个类的两个不同实例的相同名称的同步方法,效果却是以异步的方式...

  • 多个线程多个锁

    多个线程多个锁:多个线程,每个线程都可以拿到自己指定的锁,分别获得锁之后,执行synchronized方法体的内容...

  • 乐观锁机制

    乐观锁实验 无锁情况(无争抢锁) 多个线程操作同时对一个对象 多个线程操作同时对一个对象进行操作就会存在覆盖情况,...

  • synchronized 修饰静态方法、普通方法与代码块的区别

    概念: 类锁:所有对象共用一个锁 对象锁:一个对象一把锁,多个对象多把锁。 一、synchronized修饰普通方...

  • 11、关于对象池的思考

    对象池作为全局资源,高并发环境中多个线程可能同时需要获取对象池的对象,因此多个线程在争抢对象时因为锁竞争而阻塞,因...

  • 方法锁、对象锁和类锁区别

    方法锁、对象锁和类锁区别 引言:结合synchronized进行分析。 synchronized用来处理多个线程同...

  • Java中死锁的定位与修复

    我们都知道死锁是由于多个对象或多个线程之间相互需要 对方锁持有的锁而又没有释放对方所持有的锁,导致双方都永久处于阻...

  • Synchronized 作用域

    如图,synchronized可以用在方法和代码块中,被锁对象的区别: 1. 如果锁的是类对象的话,尽管new多个...

  • NSTheard

    1.一个对象要被多个线程使用,你需要一个锁来保护这个对象.NSLock

  • day8 Object.assign()方法

    合并多个对象 克隆对象(浅); 为对象添加多个方法

网友评论

      本文标题:2.1.3多个对象多个锁

      本文链接:https://www.haomeiwen.com/subject/fuyocxtx.html