A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

保证多线程的线程安全都有哪些办法啊?

6 个回复

正序浏览
同步函数,同步代码块
回复 使用道具 举报
保证多线程运行安全可以理解有以下几种方式:
1、将run()方法中涉及到的赋值代码放入同步代码块中,即synchronized(obj){赋值代码},obj相当于一把锁;
   
2、将run()方法中要调用到的函数同步,即对函数同步;

3、创建一个锁对象,是之后的升级版本,即,Lock lock =new ReentrantLock();在运行代码的前上锁Lock.lock,线程运行完后释放锁,Lock.unlock。

特别注意的是:当多个线程操作同一资源时(或者涉及到同步嵌套时),所使用到的对象锁必须是同一个,否则会造成死锁或者数据混乱,同时为了保证线程交替运行,需要在运行代码中写入wait()冻结线程和notifyAll()唤醒机制,否则会造成线程一直处于休眠状态。。。

个人理解,可能有一定的不全,仅供交流
回复 使用道具 举报
不懂……
回复 使用道具 举报
用同步机制,加锁,下面的代码是看视频中敲的,老师讲的详细
  1. package com.test.java;

  2. public class XianC  implements Runnable{

  3.         /**
  4.          * @param args
  5.          *
  6.          */
  7.         private int ticket =200;
  8.         Object obj = new Object();
  9.         boolean b=true;
  10.         public void run() {
  11.                 // TODO Auto-generated method stub
  12.                 if(b){
  13.                 while(true){
  14.                         synchronized(this){
  15.                         if(ticket>0){
  16.                                 try {
  17.                                         Thread.sleep(10);
  18.                                 } catch (InterruptedException e) {
  19.                                         // TODO Auto-generated catch block
  20.                                         e.printStackTrace();
  21.                                 }
  22.                                 System.out.println(Thread.currentThread().getName()+" code  "+ticket--);
  23.                         }
  24.                         }
  25.                 }
  26.         }else
  27.                 while(true)
  28.                         show();
  29.         }
  30.                 //同步函数  的锁是this
  31.         //如果换为静态的方法public static synchronized void show()时那么上面的锁应该是XianC.class而不是this锁了
  32.                 public synchronized void show(){
  33.                         if(ticket>0){
  34.                                 //Thread.sleep(10);
  35.                                 try {
  36.                                         Thread.sleep(10);
  37.                                 } catch (InterruptedException e) {
  38.                                         // TODO Auto-generated catch block
  39.                                         e.printStackTrace();
  40.                                 }
  41.                                 System.out.println(Thread.currentThread().getName()+"  show  "+ticket--);
  42.                 }
  43.         }
  44.         public static void main(String[] args) {
  45.                 // TODO Auto-generated method stub
  46.                
  47.                 XianC xc = new XianC();
  48.                 //Thread t = new Thread(xc);
  49.                 Thread t1  = new Thread(xc);
  50.                 Thread t2 = new Thread(xc);
  51.                 t1.start();
  52.                 //如果不加入下面一句话  打印出的结果都是在show方法中的
  53.                 try{Thread.sleep(10);}catch(Exception e){}
  54.                 //停留10毫秒  现在只有t1能运行 t1进去为真执行同步代码块 10毫秒就醒了就执行
  55.                 //xc.b=false这时候为假所以执行同步函数
  56.                 xc.b=false;
  57.                 //为什么都在show方法下执行解释如下
  58.                
  59.                 t2.start();
  60.                
  61.         }

  62.        

  63. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

回复 使用道具 举报
同步代码块和同步函数
synchronized(对象)
{
       需要被同步的代码块
}
同步函数就是把synchronized作为函数修饰符,同步函数使用的锁使用的是this
静态函数使用的锁是  类名.class
只了解这么多,共勉。
回复 使用道具 举报
我只知道  使用 stringbuffer 比 stringbulider 更安全,  其他的不清楚  还没看到线程呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马