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

  • 相关阅读:
    node 使用 ssh2-sftp-client 实现 FTP 的文件上传和下载功能
    gulp 使用 gulp.spritesmith 组件生成雪碧图
    webpack4 打包多页面应用
    javascript 两个变量值的互换
    微信公众号爬坑(react)
    文件上传(H5 + node)
    前后端分离 ajax 跨域 session 传值 (后端使用 node)
    webpack dev 日记
    npm报错 端口被占用 events.js:167 throw er; // Unhandled 'error' event Error: listen EADDRINUSE 127.0.0.1:9999
    多个 img 之间存在间隔
  • 原文地址:https://www.cnblogs.com/regnol/p/13222396.html
Copyright © 2011-2022 走看看