锁的实现有两种方式。
第一种继承Thread类重写run方法,创建类对象,那么这个类就是一个线程,这个的好处就是可以使用Thread类种的封装的方法。
第二种实现Runnable重写run方法,创建类对象,再创建Thread类,选择Thread类的构造方法把类对象传进去。
加同步的话一共有4种情况:
1.在方法内部加synchronized,此时的锁对象是(object)
例如:
private Object object = new Object(); public void run() { //synchronized的里面给个对象,这个对象是任意对象。 synchronized (object) { //同步代码块 for (int i = 0; i < 6; i++) { box.setNum(1 + i); } } }
2.在非静态方法上加synchronized,此时的锁对象是(this)
例如:
public synchronized void run() { //同步代码块 for (int i = 0; i < 6; i++) { box.setNum(1 + i); } }
3.在静态方法上加synchronized,此时的锁对象是(类名.class)
例如
public static synchronized void run() { //同步代码块 for (int i = 0; i < 6; i++) { box.setNum(1 + i); } }
4.不用synchronized,用锁来手动控制,此时的锁对象是(lock)
private Lock lock = new ReentrantLock(); @Override public void run() { try { //加锁 lock.lock(); //同步代码块 for (int i = 0; i < 6; i++) { box.setNum(1 + i); } } finally { lock.unlock(); } }
线程的运行机制: