美文网首页
synchronized的锁对象改变问题

synchronized的锁对象改变问题

作者: 跨界师 | 来源:发表于2018-01-15 21:38 被阅读400次

大家都知道synchronized是一个对象锁,所以当对象变化时,锁就会消失,就会没有同步效果。

请看下面的问题:

package Thread;

/**
 * Created by zhangzheming on 2018/1/15.
 */

public class ChangeLock {

    private String lock = "lock";

    private void method(){
        synchronized (lock){
            try {
                System.out.println("当前线程:"+Thread.currentThread().getName()+"开始");
                lock = "lock modify";
                System.out.println("当前线程:"+Thread.currentThread().getName()+"完成");
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args){
        final ChangeLock locks = new ChangeLock();

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                locks.method();
            }
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                locks.method();
            }
        });

        t1.start();
        t2.start();
    }
}

结果是两个线程是几乎是同时完成任务,为什么呢?
那是因为在进行method方法执行时,锁对象改变了,这样同步机制就消失,没有了同步效果,这样对于多线程操作时,便是每个线程对象都可以同时进行操作。

但是如果我们对class对象进行修改是否也会有上述情况呢?
答案是否定的。

package Thread;

/**
 * Created by zhangzheming on 2018/1/15.
 */

public class ModifyLock {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public synchronized void changeAttribute(String name,int age){
        try{
            System.out.println("当前线程:"+Thread.currentThread().getName()+"开始");
            this.setName(name);
            this.setAge(age);

            System.out.println("当前线程:"+Thread.currentThread().getName()+"修改对象内容为:"+this.getName()+","+this.getAge());
            Thread.sleep(2000);
            System.out.println("当前线程:"+Thread.currentThread().getName()+"结束");
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public static void main(String[] args){
        final ModifyLock locks = new ModifyLock();

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                locks.changeAttribute("zhangsan",34);
            }
        },"t1");

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                locks.changeAttribute("lisi",345);
            }
        },"t2");

        t1.start();
        t2.start();
    }
}

结果

所以对于类对象的属性进行修改,并不影响锁的效果!

相关文章

  • synchronized的锁对象改变问题

    大家都知道synchronized是一个对象锁,所以当对象变化时,锁就会消失,就会没有同步效果。 请看下面的问题:...

  • 并发编程:同步(synchronized、volatile、At

    1.synchronized关键字   synchronized 锁什么?锁对象。  可能锁对象包括: this,...

  • 2019-08-08 面试基础之并发编程

    一.synchronized关键字 1.线程安全问题 2.synchronized获取的锁分类:对象锁和类锁 二....

  • Java并发编程

    一、同步 1 synchronized关键字 synchronized锁什么?锁对象。 可能锁对象包括: this...

  • Day26 Synchronized

    synchronized原理详解synchronized内置锁是一种对象锁(锁的是对象而非引用),作用粒度是对象,...

  • 多线程中 synchronized 锁升级,偏向锁>轻量级锁>重

    多线程中 synchronized 锁升级的原理是什么? synchronized 锁升级原理:在锁对象的对象头里...

  • synchronized锁升级

    1.synchronized锁本质 synchronized锁本质是一个对象锁,即在对象中锁的一个过程。 1.1 ...

  • Java中synchronized原理

    前言 synchronized可以修饰方法和代码块。synchronized需要持有一个对象锁。分为类锁和对象锁。...

  • synchronized 详解

    关于synchronized 问题:1、锁是如何和与你传入的@synchronized的对象关联上的?2、@syn...

  • 并发

    锁:方法锁、对象锁、类锁1.方法锁(synchronized修饰方法时):synchronized放在方法和在方法...

网友评论

      本文标题:synchronized的锁对象改变问题

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