多线程
来源:互联网 发布:奢侈品销售知乎 编辑:程序博客网 时间: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");}}}}}
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- c++指针|指针入门
- 动态规划——最长公共子序列(LCS)
- 〖用cocos2d-android引擎写游戏〗(一)第一个程序HelloWorld
- Exercises2.2 E2(b)
- LeetCode - Sqrt(x)
- 多线程
- 大规模网页去重系统的简单设计和实现
- 需求分析挑战之旅(疯狂的订餐系统)(3)——背景-需要-需求规格
- 【JAVA教程】第八讲 Java网络编程(1)
- php上传类
- xxx\Microsoft.Common.targets: error MSB3073: The command xxx exited with code 4
- Hibernate3 注解详解
- 【JAVA教程】第八讲 Java网络编程(2)
- Emacs和Vim:神的编辑器和编辑器之神