java并发编程学习之synchronized学习总结

一、修饰方法
当synchronized用来修饰方法的时候,实际上取得的锁是当前对象的方法锁,也就是说,这个方法还可以被其他线程的该类对象进行访问。直接用代码测试:

package org.netease.concurrent;

public class Thread2 {

    void start() {
        A a = new A();
        B b = new B();
        C c = new C();
        a.start();
        b.start();
        c.start();
    }

    class A extends Thread {
        public void run() {
            print("a");
        }
    }

    class B extends Thread {
        public void run() {
            print("b");
        }
    }

    class C extends Thread {
        public void run() {
            print("c");
        }
    }

    public synchronized  void print(String a) {
        System.out.println("----print----" + a);
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("----print2----" + a);
    }

    public static void main(String[] args) {
        new Thread2().start();

    }
}

打印的结果是:
—-print—-a
—-print2—-a
—-print—-c
—-print2—-c
—-print—-b
—-print2—-b
当然这个结果不是唯一的,这里只是为了测试synchronized对方法的加锁,没有进行线程执行顺序控制。
结果分析:从这个结果看,因为我是通过new了一个Thread2对象进行调用方法启动的三个线程,这个三个线程是用的同一个对象,所以用synchronized加在了方法上,已经实现了对这个方法并发访问控制,下面再来测试一下多个对象访问

代码2:

package org.netease.concurrent;

public class Thread2 {

    void start() {
        A a = new A();
        B b = new B();
        C c = new C();
        a.start();
        b.start();
        c.start();
    }
    void start2() {
        A a = new A();
        B b = new B();
        C c = new C();
        a.start();
        b.start();
        c.start();
    }

    class A extends Thread {
        public void run() {
            print("a");
        }
    }

    class B extends Thread {
        public void run() {
            print("b");
        }
    }

    class C extends Thread {
        public void run() {
            print("c");
        }
    }

    public synchronized  void print(String a) {
        System.out.println("----print----" + a);
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("----print2----" + a);
    }

    public static void main(String[] args) {
        new Thread2().start();
        new Thread2().start2();

    }
}

新增了一个对象同样启动了三个线程,去访问的时候,发现打印的结果如下:
—-print—-c
—-print—-a
//这里有休眠延迟
—-print2—-a
—-print2—-c
—-print—-b
—-print—-a
—-print2—-a
—-print2—-b
—-print—-b
—-print—-c
—-print2—-b
—-print2—-c

这个print c和print a 是同时打印出来的,这就说明synchronized方法,只是当前的对象锁。
思考:spring中的controller service等默认都是单例的,也就是只有一个对象,如果在方法上加了synchronized关键字,即可实现了该方法的并发控制,只是学习使用,实际上并不可行,不然要是一万个请求过来了,那慢慢等吧。。哈哈,估计全部都是TimeOutException
继续探索synchronized 。。。前进。。。前进。。。
PS:2015-12-21 21:12:23 加上:synchronized不具有继承性,意思是:父类的synchronized方法,如果子类没有继续加上synchronized,是不被同步的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值