zoukankan      html  css  js  c++  java
  • 线程的创建方式以及synchronize的使用

    线程的两种创建方式

    • 继承 Thread

      class Thr extends Thread {
         @Override
         public void run() {
             Thread.currentThread().setName("bbb");
             System.out.println(Thread.currentThread().getName());
        }
      }
    • 实现 runnable接口

      class TT implements Runnable {
         @Override
         public void run() {
             System.out.println(Thread.currentThread().getName());
        }
      }
    • 执行线程

      public static void main(String[] args) {
             new Thr().start();
             new Thread(new TT(),"thread").start();
        }

       

    synchronized 的使用

    理解synchronized 的加锁原理.

    package concurrent01.c000;

    public class T {

       private Integer count = 10;

       public void run() {
           
           for (int i = 0; i < 10; i++) {
                   count --;
               System.out.println(Thread.currentThread().getName() +"thread name is"+count);
      }
    }
       
    }

    多个线程执行run()方法的时候,确保count的值每次只被一个线程修改.有四种方式

    1. 使用volatile关键字修饰

      private volatile static Integer count = 10;
    2. 使用synchronized关键字,给代码上锁

      package concurrent01.c000;

      public class T {

         private Integer count = 10;

         private  Object o = new Object();

         public void t1() {

             synchronized(o){
             for (int i = 0; i < 10; i++) {
                     count --;
                 System.out.println(Thread.currentThread().getName() +"thread name is"+count);
            }
        }
      }
         
      }
    3. 可以将o替代成this.

      public void t1() {
             synchronized(this){
             for (int i = 0; i < 10; i++) {
                     count --;
                 System.out.println(Thread.currentThread().getName() +"thread name is"+count);
            }
        }
    4. 也可以在方法上面加锁,这种方法和第三钟方式完全等效,代码在执行的时候,可以看成是一种方式

      package concurrent01.c000;

      public class T {
         private volatile  Integer count = 10;
         public synchronized  void t1() {
             for (int i = 0; i < 10; i++) {
                     count --;
                 System.out.println(Thread.currentThread().getName() +"thread name is"+count);
            }
        }
      }

      synchronized 在执行一段代码的时候,需要给一个对象加锁.

      执行过程

      线程执行代码块,发现synchronized,查找锁对象

      锁对象头空间有一个markdown标识,如果是00,说明这段代码还没有加锁,线程拿到代码的执行权,并给锁对象markdown标识设置为01,加锁.

      其他线程执行到这里的时候,去查看锁对象的标识,发现是01,说明这段代码已经加锁,进入等待状态.

      拿到锁的线程,执行完成之后,将锁对象的标识设置为00,即解锁

  • 相关阅读:
    GitHub上如何创建组织?
    windows中使用Git如何解决文件冲突?
    GitHub上如何删除代码仓库?
    并发编程模型和访问控制
    大数据征信的应用和启示:ZestFinance的基于大数据的信用评估技术
    Hadoop的Python框架指南
    Redis+Django(Session,Cookie、Cache)的用户系统
    如何使你的Ajax应用内容可让搜索引擎爬行
    Web运营手记
    全屏slider--swiper
  • 原文地址:https://www.cnblogs.com/regnol/p/13222396.html
Copyright © 2011-2022 走看看