多线程

来源:互联网 发布:奢侈品销售知乎 编辑:程序博客网 时间:2024/05/29 11:39

多线程在1.6中有2种实现方式

方式1:

通过extends Thread类来实现

class Ticket2 extends Thread{private int tick = 100;public void run(){while (true) {synchronized (this) {if (tick > 0) {System.out.println(Thread.currentThread().getName()+ " run" + ": " + tick);tick--;}}}}}

然后通过  Ticket2 t2 = new Ticket2(); t2.start(); 来执行线程;



方式2:

通过 implements Runnable 接口来实现.

class Ticket implements Runnable {private int tick = 100;@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {if (tick > 0) {System.out.println(Thread.currentThread().getName() + " run" + ": " + tick);tick--;}}}}

然后通过

Ticket t1 = new Ticket();

Thread thread = new Thread(t1);

thread.start();

来执行线程.


多线程必然会出现多个线程访问同一个数据的情况, 在这个情况下, 必然会出现错误数据, 如上述代码中, tick出现负数的情况.

这个情况就叫做线程安全问题, 为了解决这个问题, 引入了锁的机制. synchronized.

锁的原则是, 仅锁对共享数据进行访问的代码语句.

锁可以加在制定代码上, 也可以加在整个方法上.

锁代码块示例:

class Ticket2 extends Thread{private int tick = 100;public void run(){while (true) {synchronized (this) {//仅针对以下两句加了锁if (tick > 0) {System.out.println(Thread.currentThread().getName()+ " run" + ": " + tick);tick--;}}}}}



锁方法示例:

class Ticket implements Runnable {private int tick = 100;@Overridepublic synchronized void run() {//对整个run方法加了锁// TODO Auto-generated method stubwhile (true) {if (tick > 0) {System.out.println(Thread.currentThread().getName() + " run" + ": " + tick);tick--;}}}}
这个代码中是锁了run方法, 这会导致线程1进入这个方法后, 这个方法锁定, 直到运行结束. 线程2才会进入该方法, 但是等线程2有权限进入该方法后, 该方法已经执行完毕, 所以就造成了"虽然是使用了多线程执行, 但实际上还是单线程执行"的情况.

锁方法有2点需要注意:

1.动态方法锁是锁定的this对象.

2.静态方法由于优先与对象, 所以静态方法没有this可以锁, 静态方法锁的是 类.class, 也就是Ticket.class



还有一种情况需要了解, 那就是死锁. 所谓的死锁, 就是 " 由于锁代码块的时候, 需要给synchronized(对象){代码块}传递一个对象, 那么在2个不同对象的锁之间互相访问的时候的时候, 会出现2种情况: 1.和谐互惠, 我锁完了你锁, 你锁完了我锁. 2.互相争抢, 互不相让, 各自锁定, 对方都拿不到执行权, 然后程序就停止在这里." 这就是死锁.

死锁示例代码:

package com.day11;public class DeadLockDemo {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubThread t1 = new Thread(new DeadLock(true));Thread t2 = new Thread(new DeadLock(false));t1.start();t2.start();}}class Lock{static Object obj1 = new Object();static Object obj2 = new Object();}class DeadLock implements Runnable{private boolean flag;public DeadLock(boolean flag) {super();this.flag = flag;}@Overridepublic void run() {// TODO Auto-generated method stubif(flag){synchronized(Lock.obj1){System.out.println("if...obj1");synchronized(Lock.obj2){System.out.println("if...obj2");}}}else{synchronized(Lock.obj2){System.out.println("else...obj2");synchronized(Lock.obj1){System.out.println("else...obj1");}}}}}


原创粉丝点击