关于java多线程(二)

    上文中,主要提到了Thread类的相关内容,怎么产生多线程,以及一些实用的线程控制方法。本文将接着介绍多线程的同步。

    多线程编程提高了软件的运行效率,使得我们的软件可以多路并进,大大缩短了任务执行所消耗的时间。以此同时,多线程编程会造成对共享资源的争夺,容易出现混乱,产生死锁。

    因此,多线程编程需要对共享资源进行控制,我们常见的有同步,等待,通知等等。

    下面来说说synchronized(同步)。

    synchronized,可以用来修饰方法,也可以用来形成独立的代码块。如果方法前有synchronized关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行。代码块也类似。

    同步方法:

   

    上面说到,同步方法表示这个方法加锁了,那么这个锁是指什么?锁在这里有2种,一种是对象锁,如上代码,表示类实例化一对象后,执行它的同步方法时,会进行检查,是否有其他线程正在执行该同步方法,有则需要等待。如果,该类实例化了另一对象,那么其他线程仍然可以执行另一对象的相同方法。所以,多个线程执行相同对象的同步方法时才会同步;另一种锁是类锁,该锁是在同步方法前添加“static”修饰符,表示静态同步方法。 静态方法在类加载时就会分配内存空间,进行初始化。所以不管产生多少实例,当线程执行到这方式时都会进行同步。 

    同步代码块:

   

    同步代码块,原理与同步方法相同,只是同步代码块synchronized (this)提供了参数。如以上代码,this表示该类的一个实例,因此,它使用的是对象锁。同一对象时,多线程访问才会同步。那么同步代码块,可以使用类锁吗?将this参数修改为Test.class或者this.getClass(),对象锁就成为类锁了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值