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,即解锁

  • 相关阅读:
    比特币脚本及交易分析
    分析比特币网络:一种去中心化、点对点的网络架构
    比特币如何挖矿(挖矿原理)-工作量证明
    比特币所有权及隐私问题-非对称加密应用
    区块链记账原理
    用Python从零开始创建区块链
    基础语法-算术运算符
    基础语法-数据类型转换
    基础语法-数据类型介绍及使用
    基础语法-变量介绍
  • 原文地址:https://www.cnblogs.com/regnol/p/13222396.html
Copyright © 2011-2022 走看看