⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java 的多线程浅析.txt

📁 含有许多JAVA的技巧!
💻 TXT
📖 第 1 页 / 共 2 页
字号:
public synchronized void writeLock(){

if(state==EMPTY){

state=WRITING;

}

else{

while(state!=EMPTY){

try {wait();}

catch(InterruptedException e) {;}

}

}

}

public synchronized void readUnlock(){

readCnt--;

if(readCnt==0){

state=EMPTY;

notify();

}

}

public synchronized void writeUnlock(){

state=EMPTY;

notify();

}

}

现在是测试信号标志的程序:

class Process extends Thread{

String op;

Semaphore sem;

Process(String name,String op,Semaphore sem){

super(name);

this.op=op;

this.sem=sem;

start();

}

public void run(){

if(op.compareTo("read")==0){

System.out.println("Trying to get readLock:"+getName());

sem.readLock();

System.out.println("Read op:"+getName());

try {sleep((int)(Math.random()*50));}

catch(InterruptedException e){;}

System.out.println("Unlocking readLock:"+getName());

sem.readUnlock();

}

else if(op.compareTo("write")==0){

System.out.println("Trying to get writeLock:"+getName());

sem.writeLock();

System.out.println("Write op:"+getName());

try {sleep((int)(Math.random()*50));}

catch(InterruptedException e){;}

System.out.println("Unlocking writeLock:"+getName());

sem.writeUnlock();

}

}

}

public class testSem{

public static void main(String argv[]){

Semaphore lock = new Semaphore();

new Process("1","read",lock);

new Process("2","read",lock);

new Process("3","write",lock);

new Process("4","read",lock);

}

}

testSem 类从process类的四个实例开始,它是个线程,用来读或写一个共享文

件。Semaphore类保证访问不会破坏文件,执行程序,输出结果如下:

Trying to get readLock:1

Read op:1

Trying to get readLock:2

Read op:2

Trying to get writeLock:3

Trying to get readLock:4

Read op:4

Unlocking readLock:1

Unlocking readLock:2

Unlocking readLock:4

Write op:3

Unlocking writeLock:3

从这可看到,

2.5死锁以及怎样避免死锁:

为了防止数据项目的并发访问,应将数据项目标为专用,只有通过类本身的实例方法的同步区访问。为了进入关键区,线程必须取得对象的锁。假设线程要独占访问两个不同对象的数据,则必须从每个对象各取一个不同的锁。现在假设另一个线程也要独占访问这两个对象,则该进程必须得到这两把锁之后才能进入。由于需要两把锁,编程如果不小心就可能出现死锁。假设第一个线程取得对象A的锁,准备取对象B的锁,而第二个线程取得了对象B的锁,准备取对象A的锁,两个线程都不能进入,因为两者都不能离开进入的同步块,既两者都不能放弃目前持有的锁。避免死锁要认真设计。线程因为某个先决条件而受阻时,如需要锁标记时,不能让线程的停止本身禁止条件的变化。如果要取得多个资源,如两个不同对象的锁,必须定义取得资源的顺序。如果对象A和B的锁总是按字母顺序取得,则不会出现前面说道的饿死条件。



三Java多线程的优缺点



由于JAVA的多线程功能齐全,各种情况面面具到,它带来的好处也是显然易见的。多线程带来的更大的好处是更好的交互性能和实时控制性能。当然实时控制性能还取决于系统本身(UNIX,Windows,Macintosh 等),在开发难易程度和性能上都比单线程要好。当然一个好的程序设计语言肯定也难免有不足之处。由于多线程还没有充分利用基本OS的这一功能。这点我在前面已经提到,对于不同的系统,上面的程序可能会出现截然不同的结果,这使编程者偶会感到迷惑不解。希望在不久的将来JAVA的多线程能充分利用到操作系统,减少对编程者的困惑。我期待着JAVA会更好。 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -