首页 > 技术文章 > 第三章:线程的同步与死锁

djlindex 2019-07-22 01:00 原文

同步问题引出

  在多线程的处理中,可以利用Runnable描述多个线程操作的资源,而Thread描述每一个线程对象,于是当多个线程访问统一资源的时候如果处理不当就会产生数据的错误操作

 例如卖票程序,将创建若干个线程对象实现卖票的处理操作

 

线程同步处理

     上面就是每个线程数据的不同步。经过分析之后已经可以确认同步问题所产生的主要原因了那么下面就需要进行同步问题的解决,但是解决同步问题的关键是锁,指执行某一个线程执行操作的时候,其它线程外面等待;(就是一个用户访问这个资源的时候,哪怕出现了网络延迟,也要等到这个用户对这个资源操作完了,其它的用户在操作)

如果要想在程序之中实现这把锁的功能,就可以使用synchronized关键字来实现,利用此关键字可以定义同步方法或同步代码块,在同步代码块的操作里面的代码只允许一个线程执行

1、利用同步代码块处理

 一般要进行同步对象处理的时候可以采用当前对象this进行处理

再也不会执行出现-1情况了,在判断和执行两部外面加了同步代码块。加入同步处理之后,程序整体的性能下降了。同步实际上会造成性能的降低

 2、利用同步方法解决:只需要在方法定义上使用synchronize关键字即可。

在日后学习Java类库的时候会发现,系统中许多的类上使用的同步处理采用的都是同步方法

线程死锁

死锁是在进行多线程同步处理中有可能产生的一种问题,所谓死锁指若干个线程彼此互相等待的状态,观察

现在造成死锁的主要原因是因为彼此都在互相等待着,等待着对方先让出资源,死锁实际上是开发中不确定的状态,有的时候代码如果处理不当则不定期出现死锁,这是开发中的调试问题(本代码不具有代表性意义是因为这是强制锁上的,把synchronized关键字拿去,死锁解开)

   若干个线程访问统一资源时一定要进行同步处理,而过多的同步会造成死锁。

 

推荐阅读