青青子衿,悠悠我心。但为君故,沉吟至今。

线程的创建方式以及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,即解锁

posted @ 2020-07-01 23:49  revres  阅读(161)  评论(0编辑  收藏  举报

乐观加坚持