zoukankan      html  css  js  c++  java
  • java 线程下

    1.线程安全问题

    导致安全问题的出现的原因:
    多个线程访问出现延迟。
    线程随机性。
    注:线程安全问题在理想状态下,不容易出现,但一旦出现对软件的影响是非常大的。

    线程同步
    当多个线程访问同一份数据的时候,很容易出现线程安全的问题。
    让多个操作在同一个时间段内只能有一个线程进行,其它线程要等到该线程完成后才可以继续执行。

    同步代码块
    synchronized(obj)
    {
    //obj表示同步监视器,是同一个同步对象
    /**.....
    TODO SOMETHING
    */
    }

    同步方法
    synchronized 返回值类型 方法名(参数列表)
    {
    /**.....
    TODO SOMETHING
    */
    }

    同步方法的同步监听器其实的是 this

    单例模式-懒汉式

    class Singleton{
    	private static Singleton instance;
    	public static Singleton getInstance(){
    		if(instance == null){
    			synchronized (Singleton.class) {
    				if(instance == null) {
    					instance = new Singleton();
    				}
    			}
    		}
    		return instance;
     	}
    	private Singleton(){};
    }
    

    一个方法的完整定义格式
    [public | protected | private ] [static] [final] [synchronized] 返回值类型 方法名称(参数列表)
    [throws 异常1,异常2,…]
    {
    [return 返回值 ;]
    }

    2.同步锁

    jkd1.5后的另一种同步机制:
    通过显示定义同步锁对象来实现同步,这种机制,同步锁应该使用Lock对象充当。
    在实现线程安全控制中,通常使用ReentrantLock(可重入锁)。使用该对象可以显示地加锁和解锁。
    具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。

    public class X {
    	private final ReentrantLock lock = new ReentrantLock();
    	//定义需要保证线程安全的方法
    	public void  m(){
    		//加锁
    		lock.lock();
    		try{
    			//... method body
    		}finally{
    			//在finally释放锁
    			lock.unlock();
    		}
    	}
    }
    
    

    死锁
    当两个线程相互等着对方释放同步监听器;
    等着要对方的结果后才能继续执行就会发生死锁。

    线程通信
    有一个数据存储空间,划分为两部分,一部分用于存储人的姓名,另一部分用于存储人的性别;
    我们的应用包含两个线程,一个线程不停向数据存储空间添加数据(生产者),另一个线程从数据空间取出数据(消费者);
    因为线程的不确定性,存在于以下两种情况:
    若生产者线程刚向存储空间添加了人的姓名还没添加人的性别,CPU就切换到了消费者线程,消费者线程把姓名和上一个人的性别联系到一起;
    生产者放了若干数据,消费者才开始取数据,或者是消费者取完一个数据,还没等到生产者放入新的数据,又重复的取出已取过的数据;

    wait():让当前线程放弃监视器进入等待,直到其他线程调用同一个监视器并调用notify()或notifyAll()为止。
    notify():唤醒在同一对象监听器中调用wait方法的第一个线程。
    notifyAll():唤醒在同一对象监听器中调用wait方法的所有线程。

    ait()、notify()、notifyAll(),这三个方法属于Object 不属于 Thread,这三个方法必须由同步监视对象来调用,两种情况:
    1.synchronized修饰的方法,因为该类的默认实例(this)就是同步监视器,所以可以在同步方法中调用这三个方法;
    2.synchronized修饰的同步代码块,同步监视器是括号里的对象,所以必须使用该对象调用这三个方法;
    可要是我们使用的是Lock对象来保证同步的,系统中不存在隐式的同步监视器对象,那么就不能使用者三个方法了,那该咋办呢?
    此时,Lock代替了同步方法或同步代码块,Condition代替了同步监视器的功能;
    Condition对象通过Lock对象的newCondition()方法创建;
    里面方法包括:
    await(): 等价于同步监听器的wait()方法;
    signal(): 等价于同步监听器的notify()方法;
    signalAll(): 等价于同步监听器的notifyAll()方法;

  • 相关阅读:
    angular 中如何使用自定义组件
    angular组件数据和事件
    angular组件数据
    angular绑定数据
    angular自定义组件
    angular项目目录结构分析
    Angular 开发工具介绍
    从Microsoft.AspNet.Identity看微软推荐的一种MVC的分层架构
    EF How to use context.Set and context.Entry, which ships with EF4.1 ?
    C# 向IQueryable添加一个Include扩展方法
  • 原文地址:https://www.cnblogs.com/linbin7/p/14542024.html
Copyright © 2011-2022 走看看