一、 首先看一下什么是单线程。
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变量升级为全局变量,所有的对象都操作了一把锁。