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