线程的两种实现方式:
继承Thread(Thread类也实现了Runnable接口)
实现Runnable接口
synchronized:
只要synchronied()是同一把锁,那么多线程访问的时候就会阻塞
注意:对象锁和类锁是属于不同的锁,所以可以同时访问
类锁: private static synchronized void b() {}
对象锁:private synchronized void c(){}
synchronized的基本规则总结为下面3条
第一条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对“该对象”的该“synchronized方法”或者“synchronized代码块”的访问将被阻塞。
第二条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程仍然可以访问“该对象”的非同步代码块。
第三条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对“该对象”的其他的“synchronized方法”或者“synchronized代码块”的访问将被阻塞。
实例锁 -- 锁在某一个实例对象上。如果该类是单例,那么该锁也具有全局锁的概念。
实例锁对应的就是synchronized关键字。
全局锁 -- 该锁针对的是类,无论实例多少个对象,那么线程都共享该锁。
全局锁对应的就是static synchronized(或者是锁在该类的class或者classloader对象上(或者它们的返回非数组类型的方法))
解释的很清楚的一篇博客:点这里跳转