浅谈java中的多线程及synchronized锁重入的含义

多线程编程有两种方法:

1,继承Thread类

2,实现Runnable接口


注意点:

1,Thread.java类中的start()方法通知“线程规划器”此线程已经准备就绪,等待线程对象的run()方法。

如果代码thread.run()就不是异步执行了,而是同步。

2,Thread.java类也实现了Runnable接口,那么在构造Thread(Runnable target)不光可以传入Runnable接口的对象,还可以传入Thread类的对象,这样做完全可以把一个Thread对象中的run()方法交由其他线程进行调用。


synchronized:

synchronized可以在任何对象及方法上加锁,而加锁的这段代码称为“互斥区”或"临界区"。

当一个线程想要执行同步方法里的代码时,线程首先尝试去拿这把锁,如果能拿到这把锁,那么这个线程就可以执行synchronized里面的代码。如果拿不到,那么这个线程会不断地尝试拿这把锁,直到能够拿到为止,而且是有多个线程同时区争抢这把锁。


非线程安全:指多个线程对同一对象中的同一实例变量进行的操作时会出现值被更改,值不同步的情况。

currentThread()方法可以返回代码段正在被哪个线程调用的信息。

方法isAlive()的功能是判断当前的线程是否处于活动状态。

活动状态:线程已经启动且尚未终止。线程处于正在运行或准备开始运行的状态,就认为线程是“存活”的


this.interrupted():测试当前线程是否已经是中断状态,执行后具有将状态标志置清除为false的功能

this.isInterrupted():测试线程Thread对象是否是中断状态,但不清除状态标志。


可以是用异常方法停止线程。

在次深入synchronized

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

    调用用关键字synchronized声明的方法一定是排队运行的。只有共享资源的读写访问才需要同步,如果不是共享资源,那么根本就没有同步的必要。



synchronized锁重入:

  关键字synchronized拥有锁重入的功能,也就是在使用synchronized是当一个线程得到一个对象锁后,再次请求此对象锁时是可以再次得到该对象的锁的。这也证明在一个synchronized方法/块的内部掉用本类的其他synchronized方法/块是永远可以得到锁的。

  通俗说:自己可以再次获得自己内部锁。比如有1条线程获得了某对象的锁,此时这个对象锁还没有释放,当其再次想获得这个对象的锁的时候还是可以获取的,如果锁不可重入,就会造成死锁。

    可重入锁也支持在父子继承的环境中。


synchronized(this)代码块也是锁定当前对象。


“synchronized(非this)"格式的写法是将x对象本身作为”对象监视器“,这样就可得到以下3个结论:

  1,当多个线程同时执行synchronized(x){}同步代码块是呈同步效果

  2,单其他线程执行x对象中synchronized同步方法是呈同步效果

  3,当其他线程执行x对象方法里面的synchronized关键字的方法是,还是异步调用。


关键字synchronized还可以应用在static静态方法上,如果这样写,那就是对当前的*.java文件对应的Class类进行持锁。

同步synchronized(class)代码的作用其实和synchronized static 方法的作用一样。


重点---------------------》

我们可以将synchronized(string)同步代码块与String联合使用。如都输入“AA”它会是对应的哪些线程都持有相同的锁。



等待/通知机制的实现

 wait()方法:作用是使当前执行代码的线程进行等待,wait()方法是Object类中的方法,该方法的用来将当前线程置入“预执行队列”中,并在wait()所在的代码行处停止执行,直到接到通知或被中断为止,在调用wait()之前,线程必须获得对象的对象锁别级,及只能在同步方法或同步块中调用wait()方法。执行wait()方法后,当前线程释放锁。

 notify()方法:在调用前,线程也必须获取该对象的对象级别的锁。该方法用来通知哪些可能等待的该对象的对象锁的其他线程,如果有多个线程等待,则有线程规划期随机挑选出其中一个呈wait状态的线程,对其发出nofity,并使它等待获取该对象的对象锁。

注意:

    在执行notify()放后,当前线程不会马上释放该对象锁,呈wait状态的线程也并不能马上获取该对象锁,要等到执行notify()方法的线程将程序执行完,也就是退出synchronized代码后,当前线程才会释放锁,而呈wait状态所在的线程才可以获取该对象锁。


关键字synchronized可以将任何一个Object对象作为同步对象来看待,而java为每个Object都实现了wait()和notify()方法,它们必须用在被synchronized同步的Object的临界区内。通过调用wait()方法可以是处于临界区的线程进入等待状态,同时释放被同步对象的锁。而notify操作可以唤醒一个因调用wait操作而处于阻塞状态中的线程,使其进入就绪状态。被重新唤醒的线程会试图重新获取临界的控制权,也就是锁。





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值