首页 > 编程语言 > 详细

线程的创建方式以及synchronize的使用

时间:2020-07-02 09:40:07      阅读:63      评论:0      收藏:0      [点我收藏+]

线程的两种创建方式

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

线程的创建方式以及synchronize的使用

原文:https://www.cnblogs.com/regnol/p/13222396.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!