博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java线程:线程的同步与锁
阅读量:4973 次
发布时间:2019-06-12

本文共 1511 字,大约阅读时间需要 5 分钟。

 

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对象,静态和非静态方法的锁互不干涉,

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

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

    

 

转载于:https://www.cnblogs.com/2nao/p/6493261.html

你可能感兴趣的文章
简单权限管理系统原理浅析
查看>>
springIOC第一个课堂案例的实现
查看>>
求输入成绩的平均分
查看>>
php PDO (转载)
查看>>
wordpress自动截取文章摘要代码
查看>>
[置顶] 一名优秀的程序设计师是如何管理知识的?
查看>>
scanf和gets
查看>>
highcharts 图表实例
查看>>
ubuntu下如何查看用户登录及系统授权相关信息
查看>>
秋季学期学习总结
查看>>
SpringBoot 优化内嵌的Tomcat
查看>>
【LaTeX】E喵的LaTeX新手入门教程(1)准备篇
查看>>
highcharts曲线图
查看>>
extjs动态改变样式
查看>>
PL/SQL Developer 查询的数据有乱码或者where 字段名=字段值 查不出来数据
查看>>
宏定义
查看>>
笔记:git基本操作
查看>>
生成php所需要的APNS Service pem证书的步骤
查看>>
JavaWeb之JSON
查看>>
HOT SUMMER 每天都是不一样,积极的去感受生活 C#关闭IE相应的窗口 .
查看>>