关于java多线程

package testSynchronized;

/**
 *
 *  当使用this也就是该文件中的testclass对象作为对象锁时,
 *  两个线程都使用该对象锁访问该对象的同步代码块,
 *  是顺序执行的,
 *  也就是说当一个线程使用testclass对象对这段同步代码块上锁了以后,
 *  另一个线程无法再使用testclass对象进入该同步代码块
 *  理解:
 *  因为该锁标记对象已经被标记为正在使用,所以只能排队
 *
 */
class TestClass {
    public void f(){
        synchronized(this){
            for(int i = 0 ; i < 1000 ; i ++){
                System.out.println("i: " + i );
            }
        }
    }
}
class ThreadTest extends Thread {
    private TestClass testclass ;
    public ThreadTest(TestClass testclass) {
        this.testclass = testclass ;
    }
    @Override
    public void run() {
        testclass.f();
    }
}
public class TestSynchroinzed {
    public static void main(String[] args) {
        TestClass testclass = new TestClass() ;
        ThreadTest thread1 = new ThreadTest(testclass) ;
        ThreadTest thread2 = new ThreadTest(testclass) ;
        thread1.start();
        thread2.start();
    }
}

在来一个:

package testSynchronized;
/**
 *
 * 在该类中测试两个线程使用不同的锁对象,观察能不能同时访问一个同步代码块
 *
 * 出现的结果和TestSynchronized相反。这两个线程可以同时进入该同步代码块执行。
 *
 * why ???????
 *
 * 测试结果表明:
 *     使用同一对象锁的多个线程需要排队访问
 *     使用不同对象锁的多个线程可以同时访问(完全是不同的对象,不同的内存空间,当然不存在线程问题)
 *
 * 似乎明白了:
 *  使用this作为锁标记,当一个线程使用这个锁标记锁住某些
 *  (可以使用一个线程同时访问使用一个对象标记锁的多个同步代码块,
 *  那么这个线程就使用该对象锁住了多个同步代码块)代码块后,
 *  其他的线程准备执行这个对象的这个同步代码块时,
 *  会被告知这个this对象正在被使用锁住一些同步代码,还没有被释放,所以无法使用该锁进入同步代码块。
 *  只有使用该锁锁住的所有同步代码块都执行结束的后,
 *  其他的线程才能够重新使用该对象作为锁标记进入同步代码块
 *
 *  但是如果调用的就是不同的对象方法,
 *  那么就不会存在同步的问题,
 *  因为完全是两个不同的方法,不同的内存空间。
 */
class TestClass1 {
    public void f(){
        synchronized(this){
            while(true);
        }
    }
    public void f2(){
        synchronized(this){
            for(int i = 0 ; i < 100 ; i ++){
                System.out.println("################");
            }
        }
    }
}
class ThreadTest1 extends Thread {
    private TestClass1 testclass ;
    public ThreadTest1(TestClass1 testclass) {
        this.testclass = testclass ;
    }
    @Override
    public void run() {
        testclass.f();
    }
}
class ThreadTest2 extends Thread {
    private TestClass1 testclass ;
    public ThreadTest2(TestClass1 testclass) {
        this.testclass = testclass ;
    }
    @Override
    public void run() {
        testclass.f2();
    }
}
public class TestSynchronized2 {
    public static void main(String[] args) {
        TestClass1 testclass = new TestClass1() ;
        TestClass1 testclass2 = new TestClass1() ;
        ThreadTest1 thread1 = new ThreadTest1(testclass) ;
        ThreadTest2 thread2 = new ThreadTest2(testclass) ;
        thread1.start();
        thread2.start();
    }
}
时间: 2024-10-09 19:57:08

关于java多线程的相关文章

Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例

概要 本章,我们对JUC包中的信号量Semaphore进行学习.内容包括:Semaphore简介Semaphore数据结构Semaphore源码分析(基于JDK1.7.0_40)Semaphore示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3534050.html Semaphore简介 Semaphore是一个计数信号量,它的本质是一个"共享锁". 信号量维护了一个信号量许可集.线程可以通过调用acquire()来获取信号量的许可

从JAVA多线程理解到集群分布式和网络设计的浅析

对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些常用的,在后续文章中如果有必要再说明更加复杂的吧,本文主要说明多线程的一下几个内容: 1.在应用开发中什么时候选择多线程? 2.多线程应该注意些什么? 3.状态转换控制,如何解决死锁? 4.如何设计一个具有可扩展性的多线程处理器? 5.多线程联想:在多主机下的扩展-集群? 6.WEB应用的多线程以及

java多线程心得

多并发的时候,在什么情况下必须加锁?如果不加锁会产生什么样的后果. 加锁的场景跟java的new thread和Runnable的关系是什么? 看看java的concurrentMap源码. 还有spring 的web.xml启动执行源码 spring aop http://www.cnblogs.com/FDROSE1001/p/3661895.html activemq的本质是什么? java的jms hibernate由配置文件映射到实体类的本质是什么? java反射 spring aop

Rhythmk 一步一步学 JAVA (21) JAVA 多线程

1.JAVA多线程简单示例 1.1 .Thread  集成接口 Runnable 1.2 .线程状态,可以通过  Thread.getState()获取线程状态: New (新创建) Runnable (可以运行) Blocked  (被阻塞) Waiting  (等待) Timed waiting (计时等待) Terminated  (被终止) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

(转载)Java多线程入门理解

转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?如果你觉得此文很简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解),或者看这个专栏:Java并发编程与技术内幕.你将会对Java里头的高并发场景下的线程有更加深刻的理解. 目录(?)[-] 一扩展javalangThread类 二实现javalan

Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock

ReentrantLock介绍 ReentrantLock是一个可重入的互斥锁,又被称为"独占锁". 顾名思义,ReentrantLock锁在同一个时间点只能被一个线程锁持有:而可重入的意思是,ReentrantLock锁,可以被单个线程多次获取.ReentrantLock分为"公平锁"和"非公平锁".它们的区别体现在获取锁的机制上是否公平."锁"是为了保护竞争资源,防止多个线程同时操作线程而出错,ReentrantLock在

synchronized与static synchronized 的差别、synchronized在JVM底层的实现原理及Java多线程锁理解

本Blog分为例如以下部分: 第一部分:synchronized与static synchronized 的差别 第二部分:JVM底层又是怎样实现synchronized的 第三部分:Java多线程锁,源码剖析 第一部分:synchronized与static synchronized的差别 1.synchronized与static synchronized 的差别 synchronized是对类的当前实例进行加锁,防止其它线程同一时候訪问该类的该实例的全部synchronized块.注意这里

深入聊聊Java多线程

一.背景 在没有学习Java多线程以前,总觉得多线程是个很神秘的东西,只有那些大神才能驾驭,新年假期没事就来学习和了解一下Java的多线程,本篇博客我们就来从头说一下多线程到底是怎么回事. 二.概述 1.进程的概念 每一个正在运行的程序都是一个进程,它是系统进行资源分配和调用的独立单位.且 每一个进程都有自己的内存空间和系统资源. 2.线程的概念 是进程中的单个顺序控制流,是一条执行路径.每个进程都可以拥有一个或者多个线程.各个线程之间都共享所属的那个进程的内存空间和系统资源. 3.单线程和多线

Java多线程 2 线程的生命周期和状态控制

一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable). 注意:不能对已经启动的线程再次调用start()方法,否则会出现Java.lang.IllegalThreadStateException异常. 2.就绪状态 处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列(尽管是采用队列形式,事实上,把它

Java 多线程

多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点.掌握了上图中的各知识点,Java中的多线程也就基本上掌握了.主要包括: Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的start()方法(t