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

来源:互联网 发布:小学生课外阅读软件 编辑:程序博客网 时间:2024/05/16 04:51

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张票的情况了,考虑可能是因为电脑多核的原因。

阅读全文
0 0
原创粉丝点击