码迷,mamicode.com
首页 > 编程语言 > 详细

关于java多线程

时间:2015-07-21 12:13:23      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

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();
    }
}

 

关于java多线程

标签:

原文地址:http://www.cnblogs.com/caiyao/p/4663759.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!