Java线程:线程的同步与锁

 

1.同步和锁

    java中每个对象都有一个内置锁,程序执行非静态的synchronized同步方法时,自动获得执行该方法的对象有关的锁.

    一个对象只有一个锁,当一个线程获得锁,其他线程不能进入该对象上的synchronized方法或代码块.直到锁被释放.

    线程可以有多个锁,例如,一个对象的同步方法中调用另一个对象的同步方法

2.静态方法的同步

    同步静态方法,用的是类对象的锁,即xx.class.

3.线程安全类

    对类中的方法进行了同步,但操作这个类时仍然不一定安全.

    例如:

      public  class NameList{

        private List nameList=Collections.synchonizedList(new LinkedList());

         public void add(String name){

          nameList.add(name);

        }

        public Stirng removeFirst(){
         if(nameList.size()>0){
          return (String)nameList.remove(0);

          }else{
            return null;

            }

          }

        }

        public classTest{

          public static void main(String[] args){

          final NameList list=new NameList(); 

            nl.add("aaa");
            class NameDropper extends Thread{
                    public void run(){
                      String name = nl.removeFirst();
                      System.out.println(name);
                  }
              }

                Thread t1 = new NameDropper();
                Thread t2 = new NameDropper();
                t1.start();
                t2.start();
              }
        } 

      虽然集合对象时安全的,但程序还是有问题的,解决办法  ,在两个方法上进行同步synchronized

4.java中实现线程同步:

        a.将需要同步访问的资源定义为private

        b.哪里修改此资源,使用synchronized关键字同步操作的方法或者代码块

5.总结:

    线程的同步是为了保护多线程访问同一个资源时,对资源的破坏

    线程同步方法时通过锁来实现的,每个对象仅仅有一个锁,一个线程获得了对象锁,其他线程就无法访问该对象的同步方法

    对于静态同步方法,锁是针对这个类的,锁对象时这个类的Class对象,静态和非静态方法的锁互不干涉,

    当多个线程等待一个对象锁时,没有获得锁的线程将发生阻塞

    死锁是线程间相互等待对方的锁造成的,死锁发生,程序死掉

    

 

posted @ 2017-03-02 23:54  我_会飞的鱼  阅读(205)  评论(0编辑  收藏  举报