Java多线程的两种实现方式的区别以及深刻同步问题中的锁对象

首先我们知道创建线程有两种方式:

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

一个背包,几本书,所有喜欢的歌,

Java多线程的两种实现方式的区别以及深刻同步问题中的锁对象

相关文章:

你感兴趣的文章:

标签云: