zoukankan      html  css  js  c++  java
  • java架构《并发线程基础一》

    1、实现线程常见的两种的方式 :
     

       1:继承extends Thread 
       2:实现new Runnable 实现其run方法


    2、线程安全
        结论: 当多个线程访问某一个类(对象或方法)时,这个对象始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的。

    3、 关键字synchronized(加锁)
        使用场景: 多个线程调用产生并发时。可以在任意对象及方法上加锁,而加锁的这段代码称为"互斥区"或"临界区"
       原理: /**

     * 分析:当多个线程访问myThread的run方法时,以排队的方式进行处理(这里排对是按照CPU分配的先后顺序而定的),
     *  一个线程想要执行synchronized修饰的方法里的代码:
     *  1 尝试获得锁
     *  2 如果拿到锁,执行synchronized代码体内容;拿不到锁,这个线程就会不断的尝试获得这把锁,直到拿到为止,
     *     而且是多个线程同时去竞争这把锁。(也就是会有锁竞争的问题)
     */
          使用方式:
                           1、对象锁
                               
                     在方法修饰符后面加 synchronized 或者方法块里面加 synchronized (this){方法块}
                                /**
                                 * 关键字synchronized取得的锁都是对象锁,而不是把一段代码(方法)当做锁,
                                 * 所以代码中哪个线程先执行synchronized关键字的方法,哪个线程就持有该方法所属对象的锁(Lock),
                                 * 
                                 * 在静态方法上加synchronized关键字,表示锁定.class类,类一级别的锁(独占.class类)。
                                 * @author alienware
                                 *
                                 */ 

                               2、 类锁

                       
                在方法里代码块加 synchronized (类.class){方法块}
                               3、任何对象锁
                                
                定义: private Object lock = new Object();
                                使用定义的对象做为锁 synchronized (lock){代码块}
                                
                                注意事项:尽量不要直接使用字符串做为锁。这样有可能拿不到锁


    4、对象锁线程同步和异步
         
     1  /**
     2  * 分析:method1方法加锁(synchronized)      method2不加锁
     3  * t1线程先持有object对象的Lock锁,t2线程可以以异步的方式调用对象中的非synchronized修饰的方法
     4  * t1线程先持有object对象的Lock锁,t2线程如果在这个时候调用对象中的同步(synchronized)方法则需等待,也就是同步
     5  */
     6 Thread t1 = new Thread(new Runnable() {
     7 @Override
     8 public void run() {
     9 mo.method1();
    10 }
    11 },"t1");
    12  
    13 Thread t2 = new Thread(new Runnable() {
    14 @Override
    15 public void run() {
    16 mo.method2();
    17 }
    18 },"t2");
     5、线程原子性
                 原理:同一个类中,主线程main方法新开子线程 调用加锁的方法修改全局变量,在方法里打印修改后的结果。结果和修改后的一
                            致,在主线程打印,任是原数据,并没修改,证明,子线程修改和主线程没有任何关联。

     
     6、synchronized的重入
                 原理:调用synchronized加锁的方法。其方法体还是可以继续调synchronized加锁的方法。这就是重入(父子关系extends)重入
                            一样,数据保持同步。

    7、锁对象的改变问题
                原理:使用全局变量的对象做为锁。新建两个线程。都调用了使用了全局变量加锁的方法。只要在synchronized(对象){代码块},
                           代码块修改全局变量的值 ,则对象锁发生了改变。
                解决方案:同一对象属性的修改不会影响锁的情况   在线程启动时synchronized方法外修改对象,对象锁不影响 还是同一把锁

    8、使用synchronized代码块减小锁的粒度,提高性能。也就是在代码块加锁。
  • 相关阅读:
    为民服务贴——提供学习交流的其他比较好的平台
    【转】Web服务软件工厂
    【转】在 SQL Server 2005 中使用表值函数来实现空间数据库
    回家过年(春联)
    ArcGIS Server9.2学习开发(2)——安装配置篇
    烦困人间 游戏生活
    ArcGIS Server9.2学习开发(6)——使用Navigation、ZoomLevel和ScaleBar控件
    【转】激活 ActiveX 控件
    用Eclipse写java
    无题
  • 原文地址:https://www.cnblogs.com/coes/p/6846338.html
Copyright © 2011-2022 走看看