在多线程的处理中,可以利用Runnable描述多个线程操作的资源,而Thread描述每一个线程对象,于是当多个线程访问同一资源的时候,如果处理不当就会产生数据的错误操作。
同步问题的引出
下面编写一个简单的卖票程序,将创建若干个线程对象实现卖票的处理操作。
范例:
票贩子A卖票,ticket10
票贩子B卖票,ticket9
票贩子C卖票,ticket8
票贩子A卖票,ticket7
票贩子B卖票,ticket6
票贩子C卖票,ticket6
票贩子A卖票,ticket5
票贩子B卖票,ticket4
票贩子C卖票,ticket3
票贩子A卖票,ticket2
票贩子C卖票,ticket1
票贩子B卖票,ticket0
票已卖完
票已卖完
票贩子A卖票,ticket-1
票已卖完
线程同步:解决同步问题的关键是锁,指的是当某一个线程执行操作的时候,其他线程外面等待。synchronized关键字来实现来同步。
利用同步代码块进行处理
synchronized(同步对象){
同步代码操作;
}
一般要进行同步对象处理的时候,可以采用当前对象this进行同步
范例:利用同步代码块解决数据同步访问的问题
加入同步处理之后,程序的整体性能下降了。同步实际上会造成性能的降低。
利用同步方法解决:只需要在方法定义上使用synchronized关键字即可。
在以后学习java类库的时候回发现,系统中许多类上使用的同步处理采用的都是同步方法。
线程死锁
死锁是在进行多线程同步的处理之中有可能产生的一种问题,所谓的死锁指的是若干个线程彼此互相等待的状态。
若干个线程访问同一资源时一定要进行同步处理,而过多的同步会造成死锁。