多线程(1)

       一、 首先看一下什么是单线程。

public class test{
    public static void main(String[] args) {
        System.out.println("执行");
        test1();
        System.out.println("执行主线程");
    }
    
    public static void test1(){
        System.out.println("调用了单线程");
    }
}

           以上例子就是一个单线程,从上到下按照顺序执行,自己理解为同步执行。而多线程是同一时间多个线程一起执行(cpu运行很快,近似一起执行),异步执行。

       二、 实现多线程的方法有两种。

        1、继承Thread类。

        2、实现Runnable接口(主要用这种方式,能够实现多接口)

        三、线程安全

                当访问多线程时,为了防止访问脏数据,所以有了锁,获取锁之后,只有当前线程访问完锁的数据之后,别的线程才能访问。锁机制常用的有:synchronized.

        四、synchronized

    public class Thread2 implements Runnable{

	public int count=0;
	@Override
	public void run() {
		count++;
	}
    }

    public class test{
	public static void main(String[] args) {
		Thread2 t2= new Thread2();
		Thread t = new Thread(t2);
		t.start();
	}
    }

                当多个线程访问Thread2的run方法的时候,如果使用了synchronized修饰,那个多线程就会一个一个执行,一个线程想要执行synchronized修饰的方法里的代码,首先是尝试获得锁,如果拿到锁,执行synchronized代码体的内容,如果拿不到锁的话,这个线程就会不断的尝试获得这把锁,直到拿到为止,而且多个线程同时去竞争这把锁,也就是会出现锁竞争的问题。一个对象一把锁,说白了就是你创建一个Thread2实例,就有一个锁,再创建就再多一个锁,他们互不影响,就跟局部变量似的。如果说把count变成static修饰了,那就相当于把count变量升级为全局变量,所有的对象都操作了一把锁。

猜你喜欢

转载自blog.csdn.net/lixiaoyi01/article/details/80194392