`

java线程synchronized与死锁

 
阅读更多

对象锁:每个对象有一把锁,若对象的属性和函数被synchronized修饰的,则他们在被访问之前必须获得对象的锁。

类锁:每个类有一把锁,若类静态的属性和函数被synchronized修饰的,则他们在被访问之前必须获得对象的锁。


如果被synchronized修饰的函数,调用同一个对象或类被synchronized修饰的函数或属性时,会发生死锁

 

 

package com.threadPool;

import java.util.LinkedList;
import java.util.logging.Logger;

public class TestPool {
	private final static int  nThreads = 100;
    private final static Mythread[] threads = new Mythread[nThreads];
    private final static LinkedList queue = new LinkedList();
    public TestPool(int nThreads)
    {
        PoolWorker poolWorker1 = new PoolWorker();
        poolWorker1.setName("poolwork1");
        poolWorker1.start();
        PoolWorker poolWorker2 = new PoolWorker();
        poolWorker2.setName("poolwork2");
        poolWorker2.start();
        
        for (int i=0; i<nThreads; i++) {
            threads[i] = new Mythread();
            threads[i].setName("test "+i);
//            execute(threads[i]);
            /*try {
				Thread.sleep(10000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}*/
            
//            threads[i].start();
        }
    }
    
    private static void start(){
    int i=100;
    while (i-- >0) {
		execute(threads[i]);
		/*try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}*/
	}
    }
    public static void execute(Runnable r) {
        synchronized(queue) {
            queue.addLast(r);
            queue.notify();
        }
    }
    private class PoolWorker extends Thread {
        public void run() {
            Runnable r;
            while (true) {
                synchronized(queue) {
                    while (queue.isEmpty()) {
                        try
                        {
                        	System.out.print("pool work thread "+getName()+" wait \n");
                            queue.wait();
                        }
                        catch (InterruptedException ignored)
                        {
                        }
                    }
                    r = (Runnable) queue.removeFirst();
                }
                // If we don't catch RuntimeException, 
                // the pool could leak threads
                try {
                	System.out.print("pool work "+getName()+" and task is "+r.toString()+"\n");
                	
                    r.run();
                }
                catch (RuntimeException e) {
                    // You might want to log something here
                }
            }
        }
    }
    
    private class Mythread extends Thread{

		/* (non-Javadoc)
		 * @see java.lang.Thread#run()
		 */
		@Override
		public void run() {
			// TODO Auto-generated method stub
//			super.run();
			System.out.print("the"+getName()+"\n");
		}
    	
    }
    
    public static void  main(String[] aString){
    	TestPool testPool = new TestPool(100);
    	start();
    }
}
 这是一段简单的线程池的实例: 所有的用户任务放到queue队列中,线程池中有2个常驻工作线程,当queue中有任务时,工作线程就被唤醒,否则工作线程就进入等待状态。
分享到:
评论

相关推荐

    java多线程笔记

    Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 ...Java线程:并发协作-死锁 55 Java线程:线程之间的数据传递 58

    详解Java中synchronized关键字的死锁和内存占用问题

    Java的synchronized关键字用来进行线程同步操作,然而这在使用中经常会遇到一些问题,这里我们就来详解Java中synchronized关键字的死锁和内存占用问题:

    Java实现线程死锁

     春节的时候去面试了一家公司,笔试题里面有一道是使用简单的代码实现线程的‘死锁’,当时没有想到这道题考的是Synchronized关键字,于是自己定义了两个资源模拟了一下。后面想想肠子都悔青了,于是自己在电脑上...

    Java synchronized详细解读.docx

    Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。 需要明确的几个问题: synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句...

    Java 多线程编程面试集锦20道问题解答Java多线程编程高难度面试题及解析

    您将了解线程安全的实现、死锁的避免策略、线程池的使用方法、线程上下文切换的原因与优化、线程同步与互斥的区别、volatile关键字的作用、synchronized关键字的用法等。同时,我们还探讨了多线程编程中 通过研究和...

    java多线程安全性基础介绍.pptx

    java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 ...

    Java synchronized 详解.docx

    Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。 需要明确的几个问题: synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句...

    图解java多线程设计模式

    java.util.concurrent包、synchronized关键字、Swing框架、Java内存模型等内容也均有涉及,不仅能够了解Java多线程的相关知识,还可加深对Java语言的理解。 本书适合以下读者阅读 a.对多线程感兴趣的人 b.对Java...

    个人总结的深入java多线程开发

    看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...

    java高并发相关知识点.docx

    死锁:Java中的死锁,包括如何避免死锁和如何解除死锁。 性能优化:Java中的性能优化,包括JVM参数调优、代码优化、使用并发框架等。 并行计算:Java中的并行计算,包括Fork/Join框架、并行流等。 线程间通信:Java...

    java并发编程面试题

    java并发编程 基础知识,守护线程与线程, 并行和并发有什么区别? 什么是上下文切换? 线程和进程区别 什么是线程和进程? 创建线程有哪几种方式?,如何避免线程死锁 线程的 run()和 start()有什么区别? 什么是 ...

    33.线程的同步机制-synchronized同步语句-死锁.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    java面试题(线程和JSP及EJB部分).pdf

    1、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 答:有两种实现方法,分别是继承Thread类与实现Runnable 接口 用synchronized 关键字修饰同步方法 反对...

    Lock接口与synchronized关键字

    Lock接口与synchronized关键字在Java并发编程中都是用于实现同步机制的重要工具,但它们在使用方式、功能特性以及灵活性等方面存在一些显著的差异。 首先,从使用方式上来看,synchronized是Java语言内置的关键字,...

    JAVA高质量并发详解,多线程并发深入讲解

    接着,深入讲解了Java并发编程的核心API,如synchronized关键字、Lock接口、Condition接口、Semaphore等,帮助读者掌握Java并发编程的基本工具和方法。 除了基础知识和API的讲解,本书还重点介绍了Java并发编程的...

    Java多线程安全问题和锁

    文章目录多线程安全问题和锁线程在jvm中的特点锁的出现synchronized 关键字-监视器锁monitor lock死锁的产生和避免 什么是线程安全问题? 当多个线程同时操作同一个数据是,可能会出现数据不一样的情况,这就是线程...

    死锁_Java产生死锁的简单案例

    多个线程各自占有一些共享资源,并且互相等待其它线程占有的资源才能进行,而导致的两个或多个线程都在等待对方释放资源,都停止执行的情景。某一个同步块同时拥有“两个以上对象的锁”时,就可能会发生“死锁”的...

    JAVA实现Modbus RTU或Modbus TCPIP数据采集.rar

    3.java同步的几种方式:synchronized,volatile,显示锁,原子变量,线程及对象的基础同步方法。 4.所谓线程安全就是当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在...

    Java多线程源码笔记.pdf

    1.什么是多线程 2.Thread类解析 3.使用多线程需要注意的问题 4.synchronized锁和lock锁 5.AQS 6.ReentrantLock和ReentrantReadWriteLock 7.线程池 8.死锁 9.线程常用的工具栏 10.Atomic 11.ThreadLocal

    java笔试题大集合及答案(另附各大公司笔试题)

    60、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 答:有两种实现方法,分别是继承Thread类与实现Runnable接口 用synchronized关键字修饰同步方法 反对使用...

Global site tag (gtag.js) - Google Analytics