首先我们知道创建线程有两种方式:
1.继承
但是这两这并非完全一样的。下面谈谈区别:
因为
继承
第三个区别就是写同步函数的时候这两种方式有明显的差异
综上我们一般采用实现接口的形式来创建线程。
下面我们来说关于同步锁的问题。
Java的关于同步的问题有两种写法,一是代码块写同步,,而是写同步函数。二者确是有区别的。
同步函数使用的锁是固定的
同步代码块的锁使用的是任意对象,当线程任务需要多同步时,必须用锁来区分。
下面给出详细的解释:首先看一个死锁的示例程序:
/* * 思路:死锁,嵌套同步时最简单的。 * 两个锁对象进行嵌套。两个线程执行同样的两个锁对象嵌套 */class MyLock {public static final Object LOCKA = new Object();public static final Object LOCKB = new Object();}class Test implements Runnable {private boolean flag;Test(boolean flag) {this.flag = flag;}public void run() {if (flag) {while (true) {synchronized (MyLock.LOCKA) {System.out.println(Thread.currentThread().getName()+ "…if…..LOCKA");synchronized (MyLock.LOCKB) {System.out.println(Thread.currentThread().getName()+ "…if…..LOCKB");}}}} else {while (true) {synchronized (MyLock.LOCKB) {System.out.println(Thread.currentThread().getName()+ "…else…..LOCKB");synchronized (MyLock.LOCKA) {System.out.println(Thread.currentThread().getName()+ "…else…..LOCKA");}}}}}}public class DeadLock {public static void main(String[] args) {Test test1 = new Test(true);Test test2 = new Test(false);Thread t1 = new Thread(test1);Thread t2 = new Thread(test2);t1.start();t2.start();}}
其中MyLockA
但若写的是同步函数的形式,则锁对象是固定的
class Bank {private int sum;public void add (int num) {sum += num;System.out.println(Thread.currentThread().getName()+"…sum=" + sum);}}class Customer extends Thread{ private Bank b = new Bank();@Overridepublic void run() {this.storage();}public synchronized void storage () {for (int i = 0; i < 5; i++) {if(i == 3)try {Thread.sleep(2000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}b.add(100);}}}public class BankAndCustomer {public static void main(String[] args) {Customer c1 = new Customer();Customer c2 = new Customer();c1.start();c2.start();}}
以上代码的输出结果是(当然多线程的输出结果不唯一):
其中
但用通过实现
class Bank {private int sum;public void add (int num) {sum += num;System.out.println(Thread.currentThread().getName()+"…sum=" + sum);}}class Customer implements Runnable{ private Bank b = new Bank();@Overridepublic void run() {this.storage();}public synchronized void storage () {for (int i = 0; i < 5; i++) {if(i == 3)try {Thread.sleep(2000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}b.add(100);}}}public class BankAndCustomer {public static void main(String[] args) {Customer c = new Customer();Thread t1 = new Thread(c);Thread t2 = new Thread(c);t1.start();t2.start();}}
同时我们需要说明的是,当同步函数被标注为静态函数是他的默认锁对象就不是thisstaticsynchronizedvoidstorage()锁对象就是Customer.class
一个背包,几本书,所有喜欢的歌,