synchronized 的简单理解使用

synchronized(this)

//此处this指的是进入此代码块的线程对象(也就是那个对象调用了该方法,就表示当前锁是那个对象),如果t1进来了,那么锁住t1,若t1时间片结束了,t2走到此处也只能在上一句代码处等待t1获得了时间片后执行完synchronized锁住的所有代码,t2才能进去执行,若去掉synchronized(this),则t1和t2随时都可以进来执行此段代码中的任何一步,时间到了另一个接着进来执行

synchronized 修饰方法

用范围是整个方法,所以方法中所有的代码都是同步的

对于非静态方法,同一个实例的线程访问会被拦截,非同一实例可以同时访问。 即此时是默认对象锁(this)

对于静态方法,静态方法默认类锁。

采用类锁,无所谓哪个类,都会被拦截

synchronized (this)举例说明 :

public class SynchronizedTest {

    private void method1() {

        synchronized (this) {

            System.out.println("method1当前线程:" + Thread.currentThread().getName());

            System.out.println("method1执行过程1");

            System.out.println("method1执行过程2");

            System.out.println("method1执行过程3");

            System.out.println("method1执行过程4");

            System.out.println("method1执行过程5");

            System.out.println("method1执行过程6");

        }

    }

    public void test1() {

        new Thread() {

            @Override

            public void run() {

                super.run();

                method1();

            }

        }.start();

    }

}

首先我们定义一个SynchronizedTest 类,然后里面定义两个方法,method1方法只是 打印几行,相当于该方法的执行过程,test1方法里new 了一个线程去执行method1方法

如果我们进行如下调用会如何打印:

通过打印我们发现线程不是同步的,为什么?难道synchronized没有起作用?其实并非如此,是因为synchronized中的this每次都不是同一个对象,也就是不是同一个锁,自然10个线程执行的时候也就不会相互干扰,因为我们每次执行test1()的时候都是new SynchronizedTest()一个新的对象,自然线程执行的时候也就是使用的不同的锁。自然不会同步。

好,现在我们换一种执行策略,上代码:

现在我们观看打印:

可以看到,不管我执行多少边该代码,该方法中的代码块都是顺序执行的,换句话说,每次只能有一个线程执行该方法,而且必须等到该方法只想完成,才能让下一个线程执行,也就是打印所示,method1方法必须一次从过程1执行到过程6,才能换下个线程执行该方法。为什么?这次又和上面不一样呢?因为这次我们只是创建了一个SynchronizedTest对象,循环10次调用test1的时候每次也都是用同一SynchronizedTest对象,自然synchronized中的this指的是这同一个对象,换句话说这10个线程一直使用的是同一把对象锁,所以必须等到持有锁的线程将自己的代码执行完才能将锁释放出来,交个下一个线程执行,这样的话,该方法自然顺序执行的。

如果将加锁的方式改为直接加在方法上,道理是和SynchronizedTest(this)一样的

如上的写法和synchronized(this)是一个意思。运行效果是一样的,上面的锁都表示执行该线程的的对象。

现在我们继续修改代码:

在synchronized 中添加两个方法

public class SynchronizedTest {

    private void method1() {

        synchronized (this) {

            System.out.println("method1当前线程:" + Thread.currentThread().getName());

            System.out.println("method1执行过程1");

            System.out.println("method1执行过程2");

            System.out.println("method1执行过程3");

            System.out.println("method1执行过程4");

            System.out.println("method1执行过程5");

            System.out.println("method1执行过程6");

        }

    }

    public void test1() {

        new Thread() {

            @Over

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值