线程同步控制的几种方式

2019-04-16 12:17:01 浏览数 (1)

在多线程对同一个函数进行调用时,如果不控制号锁的机制,往往就会产生数据混乱的情况,我们通常在控制线程的同步问题时,通常采用的方法:

1:使用synchronized进行控制访问。

2:使用ReentrantLock,进行上锁,方法体结束时进行解锁,因此得到控制。

下面我分别通过一个实例,来详细说明一下,上锁的方法,如果去掉锁机制之后,你会发现数据会出现混乱的情况。

代码语言:javascript复制
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


public class TraditionalThreadSynchronized {
       public static void main(String[] args) {
		   TraditionalThreadSynchronized tt = new TraditionalThreadSynchronized();
		   tt.init();
	}
       
       public void init(){
    	   final Outeputer out = new Outeputer();
            new Thread(new Runnable() {
				@Override
				public void run() {
					while(true){
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					out.output2("robin222222222222222");
				}}
			}).start();
            
            new Thread(new Runnable() {
 				
				@Override
				public void run() {
					while(true){
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					out.output2("Tcent111111111");
				}}
			}).start();
       }
       static class Outeputer{
    	   Lock lock = new ReentrantLock();
    	   public void output(String name){
    		   synchronized (Outeputer.class) {
    			   int len = name.length();
        		   for(int i=0;i<len;i  ){
        			   System.out.print(name.charAt(i));
        		   }
        		   System.out.println();
			}
    		  
    	   }
    	   public  void  output2(String name){
    		     //lock.lock();//这里自行进行测试
    			   int len = name.length();
        		   for(int i=0;i<len;i  ){
        			   System.out.print(name.charAt(i));
        		   }
        		   System.out.println();
    		 // lock.unlock();
    	   }
    	   public void  output3(String name){
			   int len = name.length();
    		   for(int i=0;i<len;i  ){
    			   System.out.print(name.charAt(i));
    		   }
    		   System.out.println();
		  
	   }
       }
}

0 人点赞