您的位置:首页 > 编程语言

毕向东讲解(摘)—5.多线程的安全问题(同步代码块)

2017-10-12 16:42 295 查看
Java对于多线程的安全问题提供了专业的解决方式。

就是同步代码块:

Synchronized(对象)

{

      需要被同步的代码;

}

 

对象如同锁,持有锁的线程可以在同步中执行。

没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁。

 

最经典的例子:火车上的卫生间。(对于多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其它线程不可以参与执行)

 

同步的前提:

1.    必须要有两个或者两个以上的线程。(单线程没有使用锁的必要,锁还要消耗资源)

2.    必须是多个线程使用同一个锁。(如果每个线程使用的锁不同,就没有锁的必要了)

 

多线程的同步代码块,是因为要保证多线程的安全而产生的,所以我们只在我们需要同步的地方进行加锁,如果将整个run中的代码都加锁了,那么这样实际是没有意义的,就又变回了单线程的状态。

因为同步中只能由一个线程在运行。

 

好处:解决了多线程的安全问题。

 

弊端:多个线程需要判断锁,较为消耗资源;越安全越麻烦,越消耗资源。

 

publicclassTest1
{
    publicstaticvoidmain(String[]args)
    {
       Tickettk=newTicket();
       Threadt1=newThread(tk);
       Threadt2=newThread(tk);
       Threadt3=newThread(tk);
       Threadt4=newThread(tk);
       t1.start();
       t2.start();
       t3.start();
       t4.start();
    }
}
 
classTicketimplements Runnable
{
    privateintticket=100;
    Objectobj=newObject();
    publicvoidrun()
    {
       while(true)
       {
           synchronized(obj)
           {
              if(ticket>0)
              {
                  try{Thread.sleep(10);}catch(Exceptione){}
                  System.out.println(Thread.currentThread().getName()+"第"+ticket+"张票已经被卖出");
                  ticket--;
              }
           }
       }
    }
}

 

学习到线程加锁的情况之后,就开始了解到线程安全问题,线程安全考虑之后,就没有出现4张第100张票的情况了,考虑可能是因为电脑多核的原因。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 多线程